data.table:根据指标列的值和名称创建新的字符列

问题描述 投票:1回答:1

我有一个具有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大小,它将需要非常长的时间才能运行。

我看过其他帖子,但找不到与我的情况和所需的输出类似的内容。

任何帮助将不胜感激。

r data.table calculated-columns dcast
1个回答
2
投票

[我们可以按行顺序进行分组,将.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
© www.soinside.com 2019 - 2024. All rights reserved.