在R data.table中连接列名的向量

时间:2016-07-01 05:06:39

标签: r data.table

我希望向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))]

帮助表示感谢 - 谢谢。

类似的问题:

2 个答案:

答案 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;在.SDcolspaste .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,但是它满足了我的需要,可能满足了这里的需要。