r - 使用 data.table 中的列名选择多个列范围
问题描述
假设我有一个数据表,
dt = data.table(matrix(1:50, nrow = 5));
colnames(dt) = letters[1:10];
> dt
a b c d e f g h i j
1: 1 6 11 16 21 26 31 36 41 46
2: 2 7 12 17 22 27 32 37 42 47
3: 3 8 13 18 23 28 33 38 43 48
4: 4 9 14 19 24 29 34 39 44 49
5: 5 10 15 20 25 30 35 40 45 50
我想选择几个不连续的列范围,例如:a
、、和。这可以通过dplyr轻松完成:c:d
f:h
j
select()
dt %>% select(a, c:d, f:h, j)
我正在寻找一种data.table
实现相同目标的方法。
现在,我可以按任何顺序单独选择列:dt[ , .(a, c)]
或者在表单上只给出一个列名序列startcol:endcol
:
dt[ , c:f]
但是,我不能像.SDcols
我在dplyr::select
解决方案
我们可以使用范围部分,.SDcols
然后通过连接附加另一列
dt[, c(list(a= a), .SD) , .SDcols = c:d]
如果有多个范围,我们通过创建一个范围序列match
,然后获取对应的列名
i1 <- match(c("c", "f"), names(dt))
j1 <- match(c("d", "h"), names(dt))
nm1 <- c("a", names(dt)[unlist(Map(`:`, i1, j1))], "j")
dt[, ..nm1]
# a c d f g h j
#1: 1 11 16 26 31 36 46
#2: 2 12 17 27 32 37 47
#3: 3 13 18 28 33 38 48
#4: 4 14 19 29 34 39 49
#5: 5 15 20 30 35 40 50
此外,这些dplyr
方法可以在data.table
dt[, select(.SD, a, c:d, f:h, j)]
# a c d f g h j
#1: 1 11 16 26 31 36 46
#2: 2 12 17 27 32 37 47
#3: 3 13 18 28 33 38 48
#4: 4 14 19 29 34 39 49
#5: 5 15 20 30 35 40 50
推荐阅读
- python - 无法将我的本地 json 文件文本用作 intiger
- python - Spyder - Python CSV 加载
- azure - 带有 KEDA 的 Azure 功能不横向扩展超过 1 个 pod
- python - 使用 BeautifulSoup 抓取时如何解决加倍问题
- commit - 更新 git 子模块时的提交类型(常规提交)
- reactjs - 当 deps 为 [] 时,React 警告 React Hook useEffect 缺少依赖项
- c - rand() 函数是否总是使用相同的种子产生相同的结果?
- python - 当未从转换器中指定时,是否随机选择预训练模型
- c++ - #ifndef 不让我的文件看到标题中的内容(C++)
- azure-data-factory-2 - Azure 数据工厂 - 将 Application Insights 日志加载到 Data Lake Gen 2