【问题标题】:R data.table: How do you create a new column with a name from a string?R data.table:如何从字符串中创建具有名称的新列?
【发布时间】:2018-01-12 22:16:12
【问题描述】:

我有一个字符串向量,我需要在 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 次。我该如何解决这个问题?

【问题讨论】:

  • 如果您提供带有示例输入的reproducible example 而不仅仅是伪代码,那么帮助和测试可能的解决方案会容易得多。

标签: r data.table


【解决方案1】:

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

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

mtcars[, (columnstolog) := lapply(.SD, log), .SDcols = columnstolog]

【讨论】:

    【解决方案2】:

    这是一种快速而肮脏的方法:

    代码

    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]
    }
    

    输出

    > 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
    

    我相信还有更优雅的方法可以做到这一点。

    【讨论】:

      【解决方案3】:

      尝试将column_name 括在括号中。例如:

      mtcars <- as.data.table(mtcars)
      
      for (col in names(mtcars)) {
      mtcars[, (col) := 1]
      }
      

      只要你可以在 for 循环中检索分配的值,那应该会得到你想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2022-07-25
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        相关资源
        最近更新 更多