首页 > 解决方案 > 以动态列名作为变量的数据框切片

问题描述

考虑数据数据表

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

任何想法 ?在我们讨论的过程中,您能否帮我解释一下我尝试过的不成功方法背后的逻辑?谢谢你。

标签: rdata.table

解决方案


.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]

但是请注意,最后一个选项将在未来几年内正式弃用,您应该改用..前缀版本。


推荐阅读