基本R:使用具有逻辑向量的列对DF进行子集

时间:2018-04-29 19:52:35

标签: r dataframe matrix subset

我有一个数据框trainSmall,有六列。

> trainSmall
     chr      pos      end LCR gc.50  type
  1:  22 39491638 39491639   0     0 del_L
  2:  22 29434028 29434029   0     0   ins
  3:  22 28347247 28347248   0     0 del_R
  4:  22 40121931 40121932   0     0   ins
  5:  22 39122351 39122352   0     0 del_L
 ---                                      
768:  22 27869380 27869381   0     0 del_R
769:  22 28823159 28823160   0     0   ins
770:  22 24319557 24319558   0     0 del_R
771:  22 38570330 38570331   0     0 del_L
772:  22 48182139 48182140   0     0 del_L
> is.data.frame(trainSmall)
[1] TRUE

我还有一个向量excl,有四个项目。

> excl
[1] "chr"  "pos"  "end"  "type"

我想要trainSmall的所有行,但excl中只有。所以我试过

> trainSmall[, !colnames(trainSmall) %in% excl]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

但这只是给了我另一个逻辑向量,而不是数据帧中的实际行。

即使在做

> trainSmall[, c(F,F,F,T,T,F)]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

不能像我预期的那样工作。

我很困惑,因为这似乎是许多地方(如this answer)提出的用于对数据框进行子集化的方法。我做错了什么?

对可能的重复标记的响应:在这种情况下,似乎没有任何解决方案。

> trainSmall[, -which(names(trainSmall) %in% excl)]
[1] -1 -2 -3 -6
> trainSmall[ , !names(trainSmall) %in% excl]
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE

2 个答案:

答案 0 :(得分:1)

你可以去(注意括号):

df[, !(colnames(df) %in% excl)]

另一个有趣的方法是自己创建一个操作符(与%in%相反):

excl <- c("chr", "pos", "end", "type")

'%!in%' <- function(x,y)!('%in%'(x,y))
mask <- colnames(df) %!in% excl
df[,mask]

两者都会产生

   LCR gc.50
1:   0     0
2:   0     0
3:   0     0
4:   0     0
5:   0     0

答案 1 :(得分:1)

考虑到代码的输出,我认为您的数据采用data.table格式(数据表同时包含数据框和数据表)。所以,这应该有效:

trainSmall[, !excl, with = FALSE]