我有一张桌子,起点如下:
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。
答案 0 :(得分:4)
我认为@Hong Ooi的答案在这种情况下是不正确的。这将为您提供您要求的结果:
data <- data[rowSums(data==0)/ncol(data) < 0.8, ]
如果该位置的值等于零,则 data==0
会返回填充了TRUE
的数据框,否则为FALSE
。在数字上,R将TRUE
视为值为1,将FALSE
视为零值。
rowSums
为TRUE
返回的数据框中的每一行的FALSE
和data==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, ]