【问题标题】:Remove rows in dataframe with factor ""使用因子“”删除数据框中的行
【发布时间】:2011-08-17 08:47:27
【问题描述】:

我有一个像 x 这样的数据框,其中列基因是一个因素。我想删除列基因没有的所有行。因此,在表 X 中,我想删除第 4 行。有没有办法为大型数据框执行此操作?

X 
names   values   genes
1 A  0.2876113  EEF1A1 
2 B  0.6681894   GAPDH
3 C  0.1375420 SLC35E2
4 D -1.9063386        
5 E -0.4949905   RPS28

最终结果:

X 
names   values   genes
1 A  0.2876113  EEF1A1 
2 B  0.6681894   GAPDH
3 C  0.1375420 SLC35E2
5 E -0.4949905   RPS28

谢谢大家!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    从您的问题中,空值是什么并不完全清楚,但您应该能够采用下面的解决方案(这里我假设“空”值是空字符串):

    toBeRemoved<-which(X$genes=="")
    X<-X[-toBeRemoved,]
    

    【讨论】:

    • 我想你可能想要一个droplevels() 来摆脱"" 级别droplevels(X[-toBeRemoved, ])
    • 或者,你可以做subset(X, genes != "")
    • 我很确定它会。但我又回到了我的教育模式,为了清楚起见,我没有理由不使用命名变量。
    • @Roman 相当肯定它不会,括号混淆怎么办 ;-) X &lt;- X[-which(X$genes == ""), ]
    • @Gavin IDE 和它们的语法检查器会破坏程序员,这是毫无疑问的。 :)
    【解决方案2】:

    @Nick Sabbe 提供了一个很好的答案,但有一个警告:

    使用-which(...) 是一个巧妙的技巧,可以(有时)在只有几个元素要删除时加快子集操作。

    ...但是如果有没有元素要删除,它就会失败!

    因此,如果X$genes 包含任何空字符串,which 将返回一个空整数向量。否定它仍然是一个空向量。 X[integer(0)] 返回一个空的data.frame!

    toBeRemoved <- which(X$genes=="")
    if (length(toBeRemoved>0)) { # MUST check for 0-length
        X<-X[-toBeRemoved,]
    }
    

    或者,如果速度增益不重要,那么简单:

    X<-X[X$genes!="",]
    

    或者,正如@nullglob 指出的那样,

    subset(X, genes != "")
    

    【讨论】:

    • 很好的警告。也可以是if ( length(toBeRemoved) ) {。进一步观察:使用subset 也会删除所有is.na(X$genes) 为TRUE 的行。
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多