删除R中特定列中包含缺失值的行

时间:2014-02-27 06:53:47

标签: r

我想删除某些在特定列中包含缺失值的行。例如,

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    2   NA    3    3   NA    3
[2,]   NA   NA   NA   NA   NA    1
[3,]   NA    2   NA   NA    1    1
[4,]    2    3    1    3    2    1
[5,]   NA   NA   NA   NA   NA    2
[6,]    1    1    3    1    2    3

现在我想删除包含从第1列到第5列的所有缺失值的行。在这种情况下,我应该删除第2行和第5行。因此,数据框变为

   [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    2   NA    3    3   NA    3
[2,]   NA    2   NA   NA    1    1
[3,]    2    3    1    3    2    1
[4,]    1    1    3    1    2    3

如何处理?提前谢谢。

2 个答案:

答案 0 :(得分:3)

使用rowSums的另一种变体:

M[!rowSums(is.na(M[ , 1:5])) == 5, ]

#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    2   NA    3    3   NA    3
# [2,]   NA    2   NA   NA    1    1
# [3,]    2    3    1    3    2    1
# [4,]    1    1    3    1    2    3

为了更好地了解正在发生的事情,从最里面的功能开始工作并逐步添加功能通常很有用,例如:

is.na(M[ , 1:5]) # or even just M[ , 1:5]... 
rowSums(is.na(M[ , 1:5]))
rowSums(is.na(M[ , 1:5])) == 5
!rowSums(is.na(M[ , 1:5])) == 5

答案 1 :(得分:2)

首先,我重新创建您的数据并将其存储为M

M <- matrix(c(2, NA,3,3,NA,3,NA,NA,NA,NA,NA,1,NA,2,NA,NA,1,1,2,3,1,3,2,1,NA,NA,NA,NA,NA,2,1,1,3,1,2,3), ncol=6, byrow=T)

现在下一点可能有点难以理解:

首先,我发现哪些行符合条件,第1列到第5列中有NA个值。

apply(M[,1:5],1,function(x) {all(is.na(x))} )
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE

然后我选择其他行(我将!放在上面的行前面)

M[!apply(M[,1:5],1,function(x) {all(is.na(x))} ),]
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    2   NA    3    3   NA    3
[2,]   NA    2   NA   NA    1    1
[3,]    2    3    1    3    2    1
[4,]    1    1    3    1    2    3