在数据表中使用粘贴,将字符串向量作为输入
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一样的东西。
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一样的东西。