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]
但它们不起作用。
有什么想法吗?
答案 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))]
所有回报都是一样的。