在数据表中使用粘贴,将字符串向量作为输入

Use paste inside datatables, with a string vector as an input

library(datasets)
library(dplyr)
library(data.table)

data(iris)
iris <- iris %>% as.data.table()

iris[ , pasted := paste(Species, Petal.Width)]

我想要上述函数的替代方法,以便粘贴函数的输入位于字符串向量中。 (原因是我可能会重新运行脚本,并且粘贴函数中变量的名称或数量可能会有所不同。

我尝试了以下

names <- c('Species', "Petal.Width") 
iris[ , pasted := paste(names %>% get())]

或使用 .SD

 dt[, pasted:=paste0(.SD), .SDcols = names]

但它们不起作用。

有什么想法吗?

如果将向量传递给 .SDcols.SD 是这些列的数据框(因此也是列表)。您不能直接 paste 有用的数据框,这就是原始代码失败的原因。

可以 ,但是,使用 do.call 在要作为参数传递的列表上调用类似 paste 的函数,例如

library(data.table)

# passing parameters directly to `paste` works...
paste(x = c('a', 'b'), y = c(1, 2))
#> [1] "a 1" "b 2"

# ...but passing it a data frame gets weird (working in series instead of parallel)...
paste(data.table(x = c('a', 'b'), y = c(1, 2)))
#> [1] "c(\"a\", \"b\")" "c(1, 2)"

# ...so `do.call` turns the call here into the first version
do.call(paste, data.table(x = c('a', 'b'), y = c(1, 2)))
#> [1] "a 1" "b 2"

那么,在上下文中,

data(iris)
setDT(iris)
cols <- c("Species", "Petal.Width")

iris[, pasted := do.call(paste, .SD), .SDcols = cols]

iris[, c(cols, "pasted"), with = FALSE]
#>        Species Petal.Width        pasted
#>   1:    setosa         0.2    setosa 0.2
#>   2:    setosa         0.2    setosa 0.2
#>   3:    setosa         0.2    setosa 0.2
#>   4:    setosa         0.2    setosa 0.2
#>   5:    setosa         0.2    setosa 0.2
#>  ---                                    
#> 146: virginica         2.3 virginica 2.3
#> 147: virginica         1.9 virginica 1.9
#> 148: virginica         2.0   virginica 2
#> 149: virginica         2.3 virginica 2.3
#> 150: virginica         1.8 virginica 1.8

使用 .SDcols 的替代方法是实验性 .. 表示法:

iris[, pasted := do.call(paste, .SD[, ..cols])]

或 Ananda 的优雅 mget,其中 return 是您传递其名称的变量列表:

iris[, pasted := do.call(paste, mget(cols))]

都是return一样的东西。