使用“:”根据列名称对数据框进行子集设置(例如:子集B列和D列直到F)

时间:2020-02-11 17:04:58

标签: r dataframe data.table subset

我的数据表很宽,有很多列(超过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”并不能真正解决我的问题。

我一直在想这个问题。我知道我总能从长远上解决它,但是我想知道是否有一种快速的方法,因为我经常遇到这个问题。

非常感谢您的答复!

4 个答案:

答案 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
相关问题