在data.table中的列之间查找值?

时间:2014-02-02 14:20:09

标签: r data.table

我有一个包含超过3000列的data.table,其中大多数是虚拟变量(“TRUE”或“FALSE”)。

对于给定的观察,我想找到值为“TRUE”的列名称

我可以在data.table中执行此操作吗?

library(data.table)
DT <- data.table(ID = c(1:2), V1 = c(TRUE,FALSE), V2 = c(FALSE, TRUE), V3 = c(FALSE, TRUE))

这就是我想要的。

   ID  TRUE    
1:  1   V1
2:  2   V2&V3

但我尝试使用lapply .SD但失败了。

为了简化这个问题,我认为基于单一观察运行查询很简单。 比如,如果我根据观察1运行查询,这就是我想要的。

   ID   V1    
1:  1   TRUE

同样,如果我根据观察2运行查询。

   ID   V2     V3
1:  1   TRUE   TRUE

我知道如何根据列的值进行子集化。

subsetted <- DT[ which(DT$V1=='T'), ]

但基于行,怎么做?谢谢!

1 个答案:

答案 0 :(得分:2)

我在包melt中使用reshape2将数据转换为“长”格式,同时过滤TRUE,然后在最后一步中按ID连接。

DT <- data.table(ID = c(1:2), V1 = c(TRUE,FALSE), V2 = c(FALSE, TRUE), V3 = c(FALSE, TRUE))

library(reshape2)
DT2 = data.table(melt(DT, id.vars="ID"))[value ==TRUE]

这提供了以下格式的数据:

   ID variable value
1:  1       V1  TRUE
2:  2       V2  TRUE
3:  2       V3  TRUE

然后按ID连接变量。

DT2[,list(variables=paste(variable, collapse =" ")),by=ID]

   ID variables
1:  1        V1
2:  2     V2 V3

如果您希望看到由&符号分隔的变量,请使用collapse = "&"

但我会重申Roland在评论中所说的内容,这样的表格以及V1和V8&amp; V100等各种组合并不适用于统计分析或报告。你在这里尝试做什么是直觉上不符合逻辑的,所以我建议你考虑你想要进行的分析,然后开始编写变量和编码。相应地构建数据。