仅当它们出现在超过一定百分比的列中时,如何删除带有 NA 的行?

How to remove rows with NAs only if they are present in more than certain percentage of columns?

我想对以下示例数据集使用 na.omit(数据),但条件是仅当它们出现在列的 "more than 30%" 中时才删除带有 NA 的行.

数据:

        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

感谢您的帮助!

您可以根据 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

这是另一个版本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

这里还有一个使用 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