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

时间:2017-11-14 17:15:01

标签: r data.table paste

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

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

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

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

我尝试了以下

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

或使用.SD

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

但它们不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果将向量传递给.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,它会返回您传递名称的变量列表:

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

所有回报都是一样的。