R 什么';在data.table中将多个列名传递给j的正式方式是什么?

R 什么';在data.table中将多个列名传递给j的正式方式是什么?,r,data.table,R,Data.table,我很确定我以前解决过这个问题,并在web上找到了一两个解决方法,但在暂时不使用data.table之后,我现在无法正确完成。所以我想知道:对于这样的用例,传递多个列名的确切解决方案是什么: library(data.table) data(mtcars) dt <- data.table(mtcars) cols <- c("mpg","cyl","qsec") dt[,key := paste('prefix', get(cols[1]),

我很确定我以前解决过这个问题,并在web上找到了一两个解决方法,但在暂时不使用data.table之后,我现在无法正确完成。所以我想知道:对于这样的用例,传递多个列名的确切解决方案是什么:

library(data.table)
data(mtcars)
dt <- data.table(mtcars)
cols <-  c("mpg","cyl","qsec")

dt[,key := paste('prefix',
             get(cols[1]),
             get(cols[2]),
             get(cols[3]),
             sep = ".")]
库(data.table)
数据(mtcars)

dt我们可以在
.SDcols
中指定它,并在这种情况下使用
do.call
paste

dt[, key := do.call(paste, c('prefix', .SD, sep=".")), .SDcols = cols]

或者如果使用
.SDcols时出现问题

dt[, key := do.call(paste, c('prefix', mget(cols), sep="."))]

谢谢不过,我并不奇怪我总是忘记这一点:)。不知何故,我们需要记住,
do.call
在这里是按行应用的。你有什么解释可以帮助理解/记住这一点吗?@mattbanert
paste
是一个矢量化函数。您可以使用
粘贴(col1、col2、col3、sep=“”)
,在有限数量的列上执行
粘贴操作,但是,如果我们不知道列名,并且如果有>10列,则执行此操作会有点太难。使用
do.call
,我们只需要知道数据集对象名,或者在
data.table
中,它是
.SD
(data.table的子集),这样它就可以按行粘贴了
do.call
不能与所有函数一起使用,例如
sum
(但操作员可以使用“+”)