我想删除某些在特定列中包含缺失值的行。例如,
[,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
如何处理?提前谢谢。
答案 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