根据列中的值和阈值保持值删除行

时间:2013-07-31 13:43:49

标签: r bioinformatics

我有一张桌子,起点如下:

                       SM_H1455     SM_H1456  SM_H1457   SM_H1461     SM_H1462     SM_H1463 
ENSG00000001617.7         0            0          0           0          0           0                              
ENSG00000001626.9         0            0          0           0          0           0                                                            
ENSG00000002587.5         10           0          6           2          0           2                                               
ENSG00000002726.15        8            14         0           2          16          2                                                                
ENSG00000002745.8         6            2          2           0          0           4                                 

我想删除其中> = 80%列的值为0的行。所以我这里有6个列,如果一行中有5个或更多列的值为0,那么该行需要删除。

我目前有这段代码:

data = data[!rowSums(data == 0), ]

但是这段代码只要有0就删除所有行,而不考虑80%thresh hold。

2 个答案:

答案 0 :(得分:4)

我认为@Hong Ooi的答案在这种情况下是不正确的。这将为您提供您要求的结果:

data <- data[rowSums(data==0)/ncol(data) < 0.8, ]
如果该位置的值等于零,则

data==0会返回填充了TRUE的数据框,否则为FALSE。在数字上,R将TRUE视为值为1,将FALSE视为零值。

rowSumsTRUE返回的数据框中的每一行的FALSEdata==0值加起来。 rowSums(data==0)基本上给出data中每行中为零的元素数。

ncol是原始数据对象中的列数。

因此,

rowSums(data==0)/ncol(data)是每行中等于零的元素比例。

最后,我们可以通过过滤(使用[]表示法)丢弃上述规定不小于80%的行。

更新:@Hong Ooi的编辑意味着他们的答案现在也是正确的。

答案 1 :(得分:2)

你很亲密:

data <- data[rowSums(data != 0)/ncol(data) > 0.2, ]