以动态列名称为变量的数据框切片

时间:2018-08-06 22:13:25

标签: r data.table

考虑数据数据表

DT1 = as.data.table(data.frame(col1 = c(1,2,3,2,5,1,3,3,1,2), col2 = c(3,4,5,4,3,4,5,3,4,5), col3 = c(1,2,3,4,5,6,7,8,9,10)))

我想从变量中对它进行切片。

所以

DT1[, c("col1", "col3")]

可以正常工作。 如何从存储在变量中的列名称中切片。

col_name1 <- "col1"
col_name2 <- "col3"

我尝试过get,但是没有运气。

DT1[, c(get(col_name1), "col2")]
>[1] "1"    "2"    "3"    "2"    "5"    "1"    "3"    "3"    "1"    "2"    "col2"
DT1[, get(c(col_name1, "col2"))]
>[1] 1 2 3 2 5 1 3 3 1 2


DT1[, get(c(col_name1, col_name2))]
 >[1] 1 2 3 2 5 1 3 3 1 2
DT1[, c(get(col_name1), get(col_name2))]
 >[1]  1  2  3  2  5  1  3  3  1  2  1  2  3  4  5  6  7  8  9 10

有什么主意吗?在讨论过程中,您还能帮我解释一下我尝试的方法未成功背后的逻辑吗?谢谢。

1 个答案:

答案 0 :(得分:3)

.SD.SDcols一起使用

DT1[, .SD, .SDcols = c(col_name1, col_name2)]
#    col1 col3
# 1:    1    1
# 2:    2    2
# 3:    3    3
# 4:    2    4
# 5:    5    5
# 6:    1    6
# 7:    3    7
# 8:    3    8
# 9:    1    9
#10:    2   10

或(提供的data.table版本> 1.10.2

DT1[, c(..col_name1, ..col_name2)]

DT1[, c(col_name1, col_name2), with = F]

但是请注意,最后一个选项将正式为deprecated in the next few years,而应使用..前缀版本。