按变量名提取列时保存列名

时间:2018-03-18 06:16:34

标签: r

我们说我有以下数据。表。

dt = data.table(one=rep(2,4), two=rnorm(4))
dt

现在我创建了一个名称为一列的变量。

col_name = "one"

如果我想将该列作为data.table返回,我可以执行以下操作之一。第一个选项将列名称返回为V1,第二个选项实际上将列名称设置为"一个"。

dt[,.(get(col_name))]
dt[,col_name, with=FALSE]

我想知道是否有办法使用get命令指定列名。像下面的东西,它不起作用。

dt[,as.symbol(col_name) = .(get(col_name))]

我需要带有get的列名的原因是我有非常广泛的循环,我填写空列。所以它最终看起来像这样,我循环并用cols中的列替换imp_val和中位数。

  dat2[is.na(get(imp_val)),  
              as.symbol(imp_val) := dat2[.BY, median(get(imp_val), na.rm=TRUE), on=get(cols)], by=c(get(cols))]

2 个答案:

答案 0 :(得分:0)

我们可以在{% for order in customer.orders %} {{ order.id }} {% endfor %}

中指定它
.SDcols

dt[, .SD,.SDcols = col_name]

..

如果打算将列重命名为'col_name'

dt[, ..col_name]

答案 1 :(得分:0)

你也可以使用tidyverse方法。设置:

library(data.table)
library(magrittr)
library(dplyr)
dt = data.table(one=rep(2,4), two=rnorm(4))
col_name = "one"

然后将select与非标准评估运算符!!(发音为bang-bang)一起使用:

> dt %>% dplyr::select(!!col_name)
one
1:   2
2:   2
3:   2
4:   2

返回的对象仍然是data.table

> dt %>% 
    dplyr::select(!!col_name) %>% 
    class
[1] "data.table" "data.frame"

我不清楚你的问题的第二部分是用中位数代替NA的意思。也许你可以用一个小例子来更新你的答案?