使用因子“”删除数据框中的行

时间:2011-08-17 08:47:27

标签: r grep dataframe

我有一个像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

谢谢大家!

2 个答案:

答案 0 :(得分:24)

从你的问题来看,空值是什么并不完全明显,但你应该能够采用下面的解决方案(这里我假设'空'值是空字符串):

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

答案 1 :(得分:10)

@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 != "")