R 什么';在data.table中将多个列名传递给j的正式方式是什么?
我很确定我以前解决过这个问题,并在web上找到了一两个解决方法,但在暂时不使用data.table之后,我现在无法正确完成。所以我想知道:对于这样的用例,传递多个列名的确切解决方案是什么: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]),
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
在这里是按行应用的。你有什么解释可以帮助理解/记住这一点吗?@mattbanertpaste
是一个矢量化函数。您可以使用粘贴(col1、col2、col3、sep=“”)
,在有限数量的列上执行粘贴操作,但是,如果我们不知道列名,并且如果有>10列,则执行此操作会有点太难。使用do.call
,我们只需要知道数据集对象名,或者在data.table
中,它是.SD
(data.table的子集),这样它就可以按行粘贴了do.call
不能与所有函数一起使用,例如sum
(但操作员可以使用“+”)