我的数据表很宽,有很多列(超过50个)
一个简化的示例(5列):
dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
现在我想将B列和D列细分为F 。
如果我只想D直到F,我可以这样做:
dt[, D:F]
但是,我想保留B列。我可以长期实现期望的结果,但这是我要避免的事情:
dt[, c("B", "D", "E", "F")]
我的问题是,是否可以使用如下所示的语法,但这显然行不通:
dt[, c("B", D:F)]
请记住,这是一个简化的示例,“不选择A,C,G”并不能真正解决我的问题。
我一直在想这个问题。我知道我总能从长远上解决它,但是我想知道是否有一种快速的方法,因为我经常遇到这个问题。
非常感谢您的答复!
答案 0 :(得分:5)
在 base 中,您可以使用subset
选择列B和D:F。
subset(x, select = c(B, D:F))
# B D E F
#1 1 1 1 1
#2 1 1 1 1
#3 1 1 1 1
#4 1 1 1 1
#5 1 1 1 1
#6 1 1 1 1
#7 1 1 1 1
#8 1 1 1 1
#9 1 1 1 1
#10 1 1 1 1
这也可以与data.table
一起使用,其中cbind
也可以像这样使用:
cbind(dt[,"B"], dt[, D:F])
或者您可以使用match
:
i <- match(c("B", "D", "F"), colnames(x))
x[,c(i[1],i[2]:i[3])]
数据:
x <- data.frame(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
library(data.table)
dt <- data.table(x)
答案 1 :(得分:4)
另一个选择是:
dt[, c(.(A), .SD), .SDcols=D:F]
或与mget
一起使用.SDcols
dt[, c(mget(c("A", "C")), .SD), .SDcols=E:G]
答案 2 :(得分:3)
我们可以利用select
中的dplyr
来轻松实现
library(dplyr)
library(data.table)
dt %>%
select(B, D:F)
# B D E F
# 1: 1 1 1 1
# 2: 1 1 1 1
# 3: 1 1 1 1
# 4: 1 1 1 1
# 5: 1 1 1 1
# 6: 1 1 1 1
# 7: 1 1 1 1
# 8: 1 1 1 1
# 9: 1 1 1 1
#10: 1 1 1 1
或在[]
dt[, select(.SD, B, D:F)]
答案 3 :(得分:3)
在纯data.table
中必须有一个更好的解决方案,但无论如何:
这可行(有点)
library(data.table)
dt <- data.table(A = 1:10, B = 1, C = 1, D = 1, E = 1, F = 1, G = 1)
ind <- c("B", LETTERS[4:6])
dt[, ..ind]
B D E F
1: 1 1 1 1
2: 1 1 1 1
3: 1 1 1 1
4: 1 1 1 1
5: 1 1 1 1
6: 1 1 1 1
7: 1 1 1 1
8: 1 1 1 1
9: 1 1 1 1
10: 1 1 1 1