假设我有一个数据表,
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
,c:d
,f:h
和j
。可以通过 dplyr的 select()
轻松完成:
dt %>% select(a, c:d, f:h, j)
我正在寻找一种实现相同目标的 data.table
方式。
现在,我可以按任何顺序分别选择列:dt[ , .(a, c)]
或以startcol:endcol
形式仅给出一个列名称序列:
dt[ , c:f]
但是,我无法像在.SDcols
dplyr::select
的一张镜头中选择几个列范围
答案 0 :(得分:3)
我们可以使用.SDcols
中的range部分,然后通过串联
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
答案 1 :(得分:1)
这是使用cbind
和两个或多个选择的解决方法。
cbind(dt[, .(a)], dt[, c:d])
# a c d
# 1: 1 11 16
# 2: 2 12 17
# 3: 3 13 18
# 4: 4 14 19
# 5: 5 15 20