我想删除这个数据框中的线。
a) 包含所有列的 "NA"。下面是我的数据框架示例。
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
基本上,我想得到一个数据框架,如以下内容。
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) **只在某些列中包含NA
,所以我也可以得到这样的结果。
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
同时检查 [complete.cases
] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/complete.cases.html) :
> final[complete.cases(final), ]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
na.省略'更适合于只删除所有的
NA's。
complete.cases`允许部分选择,只包括数据框架的某些列。
> final[complete.cases(final[ , 5:6]),]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
你的解决方案不可能成功。如果你坚持使用is.na
,那么你必须做一些事情。
> final[rowSums(is.na(final[ , 5:6])) == 0, ]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
但使用 "complete.cases "会更清楚,也更快。
我更喜欢用下面的方法来检查行中是否包含任何NA。
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
这将返回逻辑向量,其中的数值表示某行中是否有NA。你可以用它来查看你要删除多少行。
sum(row.has.na)
并最终删除它们
final.filtered <- final[!row.has.na,]
对于过滤具有某些部分NA的行,变得有点棘手(例如,你可以将'final[,5:6]'送至'apply')。 一般来说,Joris Meys'的解决方案似乎更优雅。