我有一个包含超过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'), ]
但基于行,怎么做?谢谢!
答案 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等各种组合并不适用于统计分析或报告。你在这里尝试做什么是直觉上不符合逻辑的,所以我建议你考虑你想要进行的分析,然后开始编写变量和编码。相应地构建数据。