我希望向data.table
添加一列,这是其他几列的串联,其中的名称已存储在向量cols
中。每https://stackoverflow.com/a/21682545/1840471我尝试了do.call
+ paste
,但无法使其正常运行。以下是我尝试过的内容:
# Using mtcars as example, e.g. first record should be "110 21 6"
dt <- data.table(mtcars)
cols <- c("hp", "mpg", "cyl")
# Works old-fashioned way
dt[, slice.verify := paste(hp, mpg, cyl)]
# Raw do.call+paste fails with message:
# Error in do.call(paste, cols): second argument must be a list
dt[, slice := do.call(paste, cols)]
# Making cols a list makes the column "hpmpgcyl" for each row
dt[, slice := do.call(paste, as.list(cols))]
# Applying get fails with message:
# Error in (function (x) : unused arguments ("mpg", "cyl")
dt[, slice := do.call(function(x) paste(get(x)), as.list(cols))]
帮助表示感谢 - 谢谢。
类似的问题:
Concatenate columns and add them to beginning of Data Frame(使用data.frames
和cbind
对do.call
进行操作 - 这在我的data.table
R - concatenate row-wise across specific columns of dataframe(不会将列作为名称或大量列处理)
Accessing columns in data.table using a character vector of column names(考虑使用列名聚合)
答案 0 :(得分:6)
我们可以使用mget
返回&#39; cols&#39;中元素的值。作为list
dt[, slice := do.call(paste, mget(cols))]
head(dt, 2)
# mpg cyl disp hp drat wt qsec vs am gear carb slice
#1: 21 6 160 110 3.9 2.620 16.46 0 1 4 4 110 21 6
#2: 21 6 160 110 3.9 2.875 17.02 0 1 4 4 110 21 6
或另一种选择是指定&#39; cols&#39;在.SDcols
和paste
.SD
dt[, slice:= do.call(paste, .SD), .SDcols = cols]
head(dt, 2)
# mpg cyl disp hp drat wt qsec vs am gear carb slice
#1: 21 6 160 110 3.9 2.620 16.46 0 1 4 4 110 21 6
#2: 21 6 160 110 3.9 2.875 17.02 0 1 4 4 110 21 6
答案 1 :(得分:0)
使用以下应用来解决一个可能更简单的解决方案:
df[, "combned_column"] <- apply(df[, cols], 1, paste0, collapse = "")
可能不适用于data.tables,但是它满足了我的需要,可能满足了这里的需要。