在data.frame中删除具有NAs(缺失值)的行

我想删除此数据框中所有列中包含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

另外,我想知道如何只筛选一些列,所以我也可以得到这样的数据框:

             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

> 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.omit更适合于删除所有NAcomplete.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.omit(your.data.frame) 。 至于第二个问题,尝试将其作为另一个问题发布(为了清晰起见)。


我更喜欢以下方式来检查行是否包含任何NAs:

row.has.na <- apply(final, 1, function(x){any(is.na(x))})

这将返回逻辑向量,其值表示一行中是否有任何NA。 您可以使用它来查看您必须删除多少行:

sum(row.has.na)

并最终放弃它们

final.filtered <- final[!row.has.na,]

对于使用某些部分NAs过滤行,它变得有点棘手(例如,您可以将'final [,5:6]'提供给'apply')。 一般来说,Joris Meys的解决方案似乎更加优雅。

链接地址: http://www.djcxy.com/p/70891.html

上一篇: Remove rows with NAs (missing values) in data.frame

下一篇: Drop factor levels in a subsetted data frame