我想将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
感谢您的帮助!
答案 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