如果只有超过一定百分比的列存在,那么如何删除具有NA的行?

时间:2016-06-17 10:37:00

标签: r na

我想将na.omit(数据)用于以下示例数据集,但条件是在只有当它们存在时才删除带有NAs的行,例如"超过30%"列。

数据:

        C1     C2     C3     C4     C5
Gene1   0.07   NA     0.05   0.07   0.07
Gene2   0.2    0.18   0.16   0.15   0.15
Gene3   NA     0.93   0.9    NA     0.92
Gene4   0.32   0.05   0.12   0.13   0.05
Gene5   0.44   0.53   0.46   0.03   0.47
Gene6   NA     0.34   NA     0.8    NA
Gene7   0.49   0.55   0.67   0.49   0.89
Gene8   0.25   NA     0.49   NA     NA
Gene9   0.1    0.1    0.05   NA     0.09

因此生成的文件应如下所示:

        C1     C2     C3     C4     C5
Gene1   0.07   NA     0.05   0.07   0.07
Gene2   0.2    0.18   0.16   0.15   0.15
Gene4   0.32   0.05   0.12   0.13   0.05
Gene5   0.44   0.53   0.46   0.03   0.47
Gene7   0.49   0.55   0.67   0.49   0.89
Gene9   0.1    0.1    0.05   NA     0.09

感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

您可以根据NA值的行总和进行子集化:

test[!rowSums(is.na(test)) > ncol(test)*.3,]

        C1   C2   C3   C4   C5
Gene1 0.07   NA 0.05 0.07 0.07
Gene2 0.20 0.18 0.16 0.15 0.15
Gene4 0.32 0.05 0.12 0.13 0.05
Gene5 0.44 0.53 0.46 0.03 0.47
Gene7 0.49 0.55 0.67 0.49 0.89
Gene9 0.10 0.10 0.05   NA 0.09

答案 1 :(得分:4)

以下是Reduce

的另一个版本
df1[!Reduce(`+`, lapply(df1, is.na)) > ncol(df1)*0.3,]
#       C1   C2   C3   C4   C5
#Gene1 0.07   NA 0.05 0.07 0.07
#Gene2 0.20 0.18 0.16 0.15 0.15
#Gene4 0.32 0.05 0.12 0.13 0.05
#Gene5 0.44 0.53 0.46 0.03 0.47
#Gene7 0.49 0.55 0.67 0.49 0.89
#Gene9 0.10 0.10 0.05   NA 0.09

答案 2 :(得分:4)

这里有另一个使用apply

的选项
dat[apply(dat,1,function(x){sum(is.na(x))/dim(dat)[2]})<0.3,]

#C1   C2   C3   C4   C5
#Gene1 0.07   NA 0.05 0.07 0.07 
#Gene2 0.20 0.18 0.16 0.15 0.15
#Gene4 0.32 0.05 0.12 0.13 0.05
#Gene5 0.44 0.53 0.46 0.03 0.47
#Gene7 0.49 0.55 0.67 0.49 0.89
#Gene9 0.10 0.10 0.05   NA 0.09