2013-03-03 50 views
4

我期待基于两个条件,从我的数据集删除行如下:条件行切除

  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)) 

我已经中存在的问题中的研究和发现,na.omitcomplete.cases可以删除与NA行,但因为我有状况,做进一步的研究,我已经找到了存在的问题中的以下代码:

data[! rowSums(is.na(data)) >4 , ] 
data[! rowSums(is.na(data)) ==3 , ] 

第一行充分填补我的第二个条件。第二行确实删除了三行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 

什么其实我想要的是第5行只删除,因为这已连续三年NA的,而不是第二行。

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

回答

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 

any(diff(v, 3) == 3)TRUE如果有NA三次连续(等方面差异的地方是3)和4 %in% v对应于第二个条件。

+0

这真的符合我的目的,也将帮助我在未来应用其他条件!非常感谢!问候, – Achak 2013-03-03 14:52:07

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, ] 
+0

嗨,非常感谢,这对我来说非常合适!亲切的问候,Ayan – Achak 2013-03-03 14:48:57