r - 以动态列名作为变量的数据框切片
问题描述
考虑数据数据表
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
任何想法 ?在我们讨论的过程中,您能否帮我解释一下我尝试过的不成功方法背后的逻辑?谢谢你。
解决方案
.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]
但是请注意,最后一个选项将在未来几年内正式弃用,您应该改用..
前缀版本。
推荐阅读
- c# - 创建后更改 GameWindow 的 GraphicsMode
- reactjs - 无法在反应中更新状态
- reactjs - 使用 React 将表单发布到 API
- prolog - 如何从材料构建中构建组件
- amazon-web-services - 连接到 VPN 时无法访问 AWS EC2 实例
- gnuplot - 在 gnuplot 中拟合时间数据的子范围
- python - 使用 Redis 的 Python 对象存储
- c# - 我需要帮助从我的代码中检索用户输入
- javascript - 包装组件后如何检索节点?
- post - 带有 Content-Type 的 Http 发布请求:application/x-www-form-urlencoded