考虑这个data.table
:
dt <- data.table(V1=c(3,2),V2=c(4,2),V3=c(6,5),V4=c(7,8),V5=c(9,10))
> dt
V1 V2 V3 V4 V5
1: 3 4 6 7 9
2: 2 2 5 8 10
我想创建一个新列,用于粘贴列子集的值和名称。应保留原始列。
所需的输出是:
> cols <- paste0("V",2:3)
> dt
V1 V2 V3 V4 V5 merged
1: 3 4 6 7 9 V2:4 V3:6
2: 2 2 5 8 10 V2:2 V3:5
我能够通过将.SD发送到函数并遍历每一行来获取输出:
getSub <- function(SD){
lapply(1:nrow(SD), function(s) paste0(cols,":", SD[s], collapse=" "))
}
dt[, merged := list(getSub(.SD)), .SDcols=cols]
> dt
V1 V2 V3 V4 V5 merged
1: 3 4 6 7 9 V1:3 V2:4 V3:6 V4:7
2: 2 2 5 8 10 V1:2 V2:2 V3:5 V4:8
我想知道是否有办法使用像dt[, merged := list(do.call(paste,c(c(cols,.SD),sep=" "))), .SDcols=cols]
这样的东西,因为它看起来要快得多https://stackoverflow.com/a/23819177/2070021?
答案 0 :(得分:3)
试试这个:
dt[, merged := do.call(paste, Map(function(x, y) paste(x, y, sep = ':'),
names(.SD), .SD)),
.SDcols = cols]
另一种选择是构建表达式并对其进行评估,但上述情况似乎足够快,不会为这个混乱烦恼。