我有一个具有1.6x10 ^ 8记录的data.table,并且我想基于指标列名称(其中值为1的地方)创建一个新的字符列。
例如,
library(data.table)
DT <- data.table::data.table(ID=c("a","a","a","b","b"),
drugA=c(1,1,1,0,0),
drugB=c(0,1,1,1,0),
drugC=c(0,0,1,0,1))
ID drugA drugB drugC
1: a 1 0 0
2: a 1 1 0
3: a 1 1 1
4: b 0 1 0
5: b 0 0 1
### NOTE: I know the paste0(...,collapse) argument might be helpful in concatenating the drug names as an intermediate step
ID drugA drugB drugC exposure
1: a 1 0 0 drugA
2: a 1 1 0 drugA+drugB
3: a 1 1 1 drugA+drugB+drugC
4: b 0 1 0 drugB
5: b 0 0 1 drugC
我希望它尽可能地健壮,并且仅依赖于data.table语法和/或其他有用的包/函数(例如dcast);我想避免创建广泛的用户定义函数,因为给定我的data.table大小,它将需要非常长的时间才能运行。
我看过其他帖子,但找不到与我的情况和所需的输出类似的内容。
任何帮助将不胜感激。
[我们可以按行顺序进行分组,将.SDcols
指定为'drug'列,将Data.table的子集(.SD
)转换为logical
,使用该子集将列名和[ C0]他们在一起
paste
或代替按行分组,我们可以遍历各列,将值更改为列名,然后用library(data.table)
DT[, exposure := paste(names(.SD)[as.logical(.SD)], collapse= '+'),
1:nrow(DT), .SDcols = drugA:drugC]
DT
# ID drugA drugB drugC exposure
#1: a 1 0 0 drugA
#2: a 1 1 0 drugA+drugB
#3: a 1 1 1 drugA+drugB+drugC
#4: b 0 1 0 drugB
#5: b 0 0 1 drugC
更改为paste
并使用do.call
删除NA
元素>
gsub