3

我有一张桌子,开始如下:

                       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% 的阈值保持。

4

2 回答 2

4

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

data <- data[rowSums(data==0)/ncol(data) < 0.8, ]

data==0TRUE如果该位置的值为零,则返回填充的数据框,否则返回FALSE. 在数值上,R 将TRUE其视为值为 1 和FALSE值为 0。

rowSums为从. TRUE_ 基本上给出了每行中为零的元素数。FALSEdata==0rowSums(data==0)data

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

rowSums(data==0)/ncol(data)因此是每行中元素的比例为零。

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

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

于 2013-07-31T15:20:27.527 回答
2

你很接近:

data <- data[rowSums(data != 0)/ncol(data) > 0.2, ]
于 2013-07-31T13:46:05.417 回答