使用带有 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]
当然,这行不通。我尝试使用 eval
和 as.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, data.table 获得了新的 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
如果我们有以下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]
当然,这行不通。我尝试使用 eval
和 as.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, data.table 获得了新的 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