基于行内NA的数量的条件行删除

Ach*_*hak 4 r list na

我希望根据以下两个条件从我的数据集中删除行:

  1. 如果连续3个单元格为NA或,则删除行
  2. 如果是四个或更多个细胞 NA

我的样本数据:

data <- rbind(c(1,1,2,3,4,2,3,2),
              c(NA,1, NA, 4,1,1,NA,2), 
              c(1,4,6,7,3,1,2,2), 
              c(NA,3, NA, 1,NA,2,NA,NA), 
              c(1,4, NA, NA,NA,4,3,2))
Run Code Online (Sandbox Code Playgroud)

我已经在现有问题中进行了研究,发现na.omit或者complete.cases可以删除行NA但是因为我有条件,做进一步研究我在现有问题中找到了以下代码:

data[! rowSums(is.na(data)) >4  , ]   
data[! rowSums(is.na(data)) ==3  , ]
Run Code Online (Sandbox Code Playgroud)

第一行完全满足我的第二个条件.第二行确实删除了三行NA但没有查找连续行并删除任何总共3行的行NA.例如:

> data
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    2    3    4    2    3    2
[2,]   NA    1   NA    4    1    1   NA    2
[3,]    1    4    6    7    3    1    2    2
[4,]   NA    3   NA    1   NA    2   NA   NA
[5,]    1    4   NA   NA   NA    4    3    2

> data[! rowSums(is.na(data)) ==3  , ]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    1    2    3    4    2    3    2
[2,]    1    4    6    7    3    1    2    2
[3,]   NA    3   NA    1   NA    2   NA   NA
Run Code Online (Sandbox Code Playgroud)

我真正想要的是第5行被删除,因为它有三个连续NA而不是第二行.

有人可以请教我如何克服这个问题?

Jul*_*ora 6

这两个条件一下子:

data[!apply(is.na(data), 1, function(x) 
  {v <- cumsum(x); any(diff(v, 3) == 3) | 4 %in% v}), ]
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,]    1    1    2    3    4    2    3    2
# [2,]   NA    1   NA    4    1    1   NA    2
# [3,]    1    4    6    7    3    1    2    2
Run Code Online (Sandbox Code Playgroud)

any(diff(v, 3) == 3)TRUE,如果有NA一排(这样的差异是某处3)三次,并4 %in% v对应于所述第二条件.


adi*_*der 5

不是美女,但它会起作用:

rle.na <- apply(is.na(data), 1, function(z){
  tmp <- rle(z)
  tmp$lengths[tmp$values]
})
data[!sapply(rle.na, function(z) any(z == 3)) | rowSums(is.na(data)) > 4, ]
Run Code Online (Sandbox Code Playgroud)