【问题标题】:Basic R: Subsetting DF by Columns with Logical Vector基本 R:按具有逻辑向量的列对 DF 进行子集
【发布时间】:2018-10-09 23:13:14
【问题描述】:

我有一个数据框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

【问题讨论】:

    标签: r dataframe matrix subset


    【解决方案1】:

    鉴于您的代码输出,我认为您的数据采用data.table 格式(数据表具有数据框和数据表作为它们的类)。所以,这应该工作:

    trainSmall[, !excl, with = FALSE]
    

    【讨论】:

      【解决方案2】:

      你可以选择(注意括号):

      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
      

      【讨论】:

      • 有趣——对我来说,trainSmall[, !(colnames(trainSmall) %in% excl)] 仍然指向[1] FALSE FALSE FALSE TRUE TRUE FALSE
      • 如何查看? is.data.frame(trainSmall) 仍然是 TRUE
      • 对我来说看起来还是一个数据框? &gt; str(trainSmall) Classes ‘data.table’ and 'data.frame': 772 obs. of 6 variables: $ chr : int 22 22 22 22 22 22 22 22 22 22 ... $ pos : int 39491638 29434028 28347247 40121931 39122351 30102666 30619293 29877272 36923243 49868710 ... $ end : int 39491639 29434029 28347248 40121932 39122352 30102667 30619294 29877273 36923244 49868711 ... $ LCR : num 0 0 0 0 0 0 0 0 0 0 ... $ gc.50: num 0 0 0 0 0 0 0 0 0 0 ... $ type : chr "del_L" "ins" "del_R" "ins" ... - attr(*, ".internal.selfref")=&lt;externalptr&gt;
      • @Randoms:这是一个data.table,使用@Yannis的方法。
      • 定义自定义运算符有效,但我需要在mask前面添加两个句点:trainSmall[, ..mask]
      猜你喜欢
      • 2021-06-20
      • 2018-07-03
      • 1970-01-01
      • 2018-05-03
      • 2021-06-16
      • 2018-09-06
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      相关资源
      最近更新 更多