使用带有 data.table 的向量中的列名以编程方式创建新列

Programmatically create new columns using column names in a vector with data.table

如果我们有以下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 但它在特定情况下不起作用。我怎样才能做到这一点?

当你想告诉 data.table 你指的是它的环境中的东西(dt 本身)或更高的东西(见?get)时,使用 get

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

我们可以使用 .SD 来子集

x[, d := .SD[[years[2]]]/.SD[[years[1]]] - 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))][]

两者都return

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