R data.table:如何使用字符串中的名称创建新列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R data.table:如何使用字符串中的名称创建新列?相关的知识,希望对你有一定的参考价值。

我有一个字符串向量,我需要在data.table中为每个字符串创建一个新列。像这样:

dt <- data.table(a = c(1,2,3), b = c(4,5,6))
column_names <- c("x", "y", "z")

我想做这样的事情:

for (column_name in column_names) {
    dt[, column_name := paste0(column_name, a, b)]
}

这应该导致这样的事情:

a | b |   x |   y |   z
-----------------------
1 | 4 | x14 | y14 | z14
2 | 5 | x25 | y25 | z25
3 | 6 | x36 | y36 | z36

但相反,它会尝试创建一个名为“column_name”的列3次。我该如何解决这个问题?

答案

您可能想要使用.SD而不是循环。将log替换为您要应用于列的任何函数。

mtcars <- as.data.table(mtcars)
columnstolog <- c('mpg', 'cyl', 'disp', 'hp')

mtcars[, (columnstolog) := lapply(.SD, log), .SDcols = columnstolog]
另一答案

这是一个快速而肮脏的方式:

library(data.table)
dt <- as.data.table(mtcars)
col_names <- c("col1", "col2", "col3")
for(i in 1:length(col_names)){
  dt[, paste(col_names[i]) := i]
}

OUTPUT

> head(dt)
    mpg cyl disp  hp drat    wt  qsec vs am gear carb col1 col2 col3
1: 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4    1    2    3
2: 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4    1    2    3
3: 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1    1    2    3
4: 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    1    2    3
5: 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2    1    2    3
6: 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1    1    2    3

我确信有更优雅的方式来做到这一点。

另一答案

尝试在括号中包装column_name。例如:

mtcars <- as.data.table(mtcars)

for (col in names(mtcars)) {
mtcars[, (col) := 1]
}

因此,只要您可以在for循环中检索指定的值,就可以获得所需的值。

以上是关于R data.table:如何使用字符串中的名称创建新列?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 R 中 data.table 中的出现组合

如果名称按组的顺序不同,R data.table 分组操作返回错误值?

R语言data.table导入数据实战:data.table数据列名称的重命名(rename)

将一行中的项目与所有其他行进行比较,并使用 data.table - R 遍历所有行

如何填充(自动填充)值,例如使用 R 中的 data.table 将 NA 替换为组中的第一个值?

如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象