【问题标题】:Programmatically create new columns using column names in a vector with data.table使用带有 data.table 的向量中的列名以编程方式创建新列
【发布时间】:2021-11-21 11:26:48
【问题描述】:

如果我们有如下data.table:

x <- data.table(`2021` = rep(10, 3), `2022` = rep(5, 3))

我们可以像这样创建一个新列:

x[, d := `2022` / `2021` -1]

现在我想将 2022 和 2021 保存在这样的向量中:

years <- c("2021", "2022")
x[, d := years[2] / years[1] -1]

当然,这不起作用。我尝试使用evalas.name,但在特定情况下它不起作用。我怎样才能做到这一点?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    有了development version 1.14.3 获得了新的env 参数(请参阅新的小插曲data.table 上的编程)。所以,推荐的方式是

    library(data.table) # development version 1.14.3 used here
    years <- c("2021", "2022")
    x[, d := yr2 / yr1 - 1, env = list(yr1 = years[1], yr2 = years[2])][]
    

    x[, d := yrs[[2]] / yrs[[1]] - 1, env = list(yrs = as.list(years))][]
    

    都返回

       2021 2022    d
    1:   10    5 -0.5
    2:   10    5 -0.5
    3:   10    5 -0.5
    

    【讨论】:

      【解决方案2】:

      我们可以使用.SD 进行子集化

      x[, d := .SD[[years[2]]]/.SD[[years[1]]] - 1]
      

      【讨论】:

        【解决方案3】:

        当您想告诉 data.table 您指的是其环境(dt 本身)或更高级别的内容时,请使用get

        x[, d := get(years[2])  / get(years[1]) -1]
        

        【讨论】:

        • 由于我没有像@Uwe建议的那样使用最后一个data.table版本,我认为这是最简单的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-07
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多