4

次の 2 つの条件に基づいて、データセットから行を削除しようとしています。

  1. 連続する 3 つのセルがNAまたはの場合、行を削除します
  2. セルが4つ以上の場合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.omitまたは行complete.casesを削除できることがわかりましNAたが、条件があるため、さらに調査を行うと、既存の質問内で次のコードが見つかりました。

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

最初の行は 2 番目の条件を満たしています。2 行目は 3の行を削除しますNAが、連続する行を検索せず、合計 3NAの行を削除します。例えば:

> 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

私が実際に望んでいるのはNA、2 行目ではなく 3 つの連続した 's があるため、5 行目を削除することだけです。

どうすればこれを克服できますか?

4

2 に答える 2

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)は、連続して 3 回TRUEあった場合(したがって、どこかの差は 3 です) であり、2 番目の条件に対応します。NA4 %in% v

于 2013-03-03T14:47:44.890 に答える
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, ]
于 2013-03-03T14:42:56.467 に答える