首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使` `dcast` `中的`drop`参数仅查看公式的RHS

使` `dcast` `中的`drop`参数仅查看公式的RHS
EN

Stack Overflow用户
提问于 2016-01-17 03:01:51
回答 1查看 1K关注 0票数 17

dcast中的drop参数(来自"reshape2“或"dplyr")在从”长“数据集变为”宽“数据集时非常有用,并且您希望为长形式中不存在的组合创建列。

事实证明,使用drop也会影响公式的左侧(LHS)和右侧(RHS)的组合。因此,它还根据LHS值的组合创建额外的行。

有什么方法可以覆盖这个行为吗?

以下是一些示例数据:

代码语言:javascript
复制
library(data.table)
DT <- data.table(v1 = c(1.105, 1.105, 1.105, 2.012, 2.012, 2.012),
                 ID = c(1L, 1L, 1L, 2L, 2L, 2L), 
                 v2 = structure(c(2L, 3L, 5L, 1L, 2L, 6L), 
                                .Label = c("1", "2", "3", "4", "5", "6"), 
                                class = "factor"),
                 v3 = c(3L, 2L, 2L, 5L, 4L, 3L)) 

请注意,"v2“是一个具有6个级别的factor列。我本质上想从“长”到“宽”,但添加任何缺少的因子级别的列(在本例中为"4")。

reshape处理形状,但不处理缺少的列:

代码语言:javascript
复制
reshape(DT, direction = "wide", idvar = c("ID", "v1"), timevar = "v2")
#       v1 ID v3.2 v3.3 v3.5 v3.1 v3.6
# 1: 1.105  1    3    2    2   NA   NA
# 2: 2.012  2    4   NA   NA    5    3

dcast会处理缺少的列的添加,但前提是LHS上有一个值:

代码语言:javascript
复制
dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE)
#    ID  1 2  3  4  5  6
# 1:  1 NA 3  2 NA  2 NA
# 2:  2  5 4 NA NA NA  3

如果LHS上有多个值,LHS上的值组合也会展开,就好像我们使用了CJexpand.grid一样,但我对第2行和第3行一点兴趣都没有:

代码语言:javascript
复制
dcast(DT, ... ~ v2, value.var = "v3", drop = FALSE)
#       v1 ID  1  2  3  4  5  6
# 1: 1.105  1 NA  3  2 NA  2 NA
# 2: 1.105  2 NA NA NA NA NA NA
# 3: 2.012  1 NA NA NA NA NA NA
# 4: 2.012  2  5  4 NA NA NA  3

这类似于在基础R:ftable(xtabs(v3 ~ ID + v1 + v2, DT))中使用xtabs

有没有办法让dcast知道,“嘿。LHS上的值的组合就是in。不要试图为我填写它们。”

我现在的方法是做三个步骤,一个是折叠lhs值,另一个是展开rhs值,然后是合并结果。

代码语言:javascript
复制
merge(DT[, list(v1 = unique(v1)), .(ID)],  ## or unique(DT[, c("ID", "v1"), with = FALSE])
      dcast(DT, ID ~ v2, value.var = "v3", drop = FALSE), 
      by = "ID")[]
#    ID    v1  1 2  3  4  5  6
# 1:  1 1.105 NA 3  2 NA  2 NA
# 2:  2 2.012  5 4 NA NA NA  3

有没有我错过的更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 06:48:21

刚刚在data.table开发版本v1.9.7中实现的commit 2113关闭了#1512

代码语言:javascript
复制
require(data.table) # v1.9.7, commit 2113+
dcast(DT, ... ~ v2, value.var = "v3", drop = c(TRUE, FALSE))
#       v1 ID  1 2  3  4  5  6
# 1: 1.105  1 NA 3  2 NA  2 NA
# 2: 2.012  2  5 4 NA NA NA  3
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34830908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档