2013-01-16 8 views
12

大きな値の列にはいくつかのNAが含まれている、大きな列のR data.tableがあります。私は、1つ以上の値の列で完全にNAであるグループを削除したいが、グループ全体を保持する。キーの各列に対してこれを繰り返します。だから、ドロップしたいRデータテーブルからNAsのブロックを削除するには

library(data.table) 
DT = data.table(
    Series = rep(letters[1:12], each = 3), 
    Id = 1:12, 
    Value1 = c(1:3, NA, 5:9, rep(NA,3), 1:3, NA, 5:9, rep(NA,3), 1:3, NA, 5:9, rep(NA,3)), 
    Value2 = c(rep(NA,3), 1:4, NA, 6:9, rep(NA,3), 1:9, 1:9, rep(NA,3))) 
DT 
    Series Id Value1 Value2 
1:  a 1  1  NA 
2:  a 2  2  NA 
3:  a 3  3  NA 
4:  b 4  NA  1 
5:  b 5  5  2 
6:  b 6  6  3 
7:  c 7  7  4 
8:  c 8  8  NA 
9:  c 9  9  6 
10:  d 10  NA  7 
11:  d 11  NA  8 
12:  d 12  NA  9 
13:  e 1  1  NA 
14:  e 2  2  NA 
15:  e 3  3  NA 
16:  f 4  NA  1 
17:  f 5  5  2 
18:  f 6  6  3 
19:  g 7  7  4 
20:  g 8  8  5 
21:  g 9  9  6 
22:  h 10  NA  7 
23:  h 11  NA  8 
24:  h 12  NA  9 
25:  i 1  1  1 
26:  i 2  2  2 
27:  i 3  3  3 
28:  j 4  NA  4 
29:  j 5  5  5 
30:  j 6  6  6 
31:  k 7  7  7 
32:  k 8  8  8 
33:  k 9  9  9 
34:  l 10  NA  NA 
35:  l 11  NA  NA 
36:  l 12  NA  NA 
    Series Id Value1 Value2 

  • シリーズ:、D、E、H及びL
  • Idsは:4、10、簡単な例を与えるために

    :11と12

正しい結果は次のようになります。

私はこのような値1のためのNAであることシリーズを見つけることができます:

DT[, sum(1-is.na(Value1)) == 0, by = Series][V1 == TRUE] 

そして、私も

setkey(DT, Series) 
DT = DT[DT[, sum(1-is.na(Value)) == 0, by = Series][V1 != TRUE]] 

を行うことができ、私がこれまで管理し何3210

Series Id Value1 Value2 
1:  b 5  5  2 
2:  b 6  6  3 
3:  c 7  7  4 
4:  c 8  8  NA 
5:  c 9  9  6 
6:  f 5  5  2 
7:  f 6  6  3 
8:  g 7  7  4 
9:  g 8  8  5 
10:  g 9  9  6 
11:  i 1  1  1 
12:  i 2  2  2 
13:  i 3  3  3 
14:  j 5  5  5 
15:  j 6  6  6 
16:  k 7  7  7 
17:  k 8  8  8 
18:  k 9  9  9 
    Series Id Value1 Value2 

しかし、最終的なテーブルにはV1が現れます。

+2

理由だけではなく 'na.omit(DT)'と列の値を持つ行をドロップしますか? – Justin

+0

'na.omit'はすべてのNAをただ削除しています。私は、「ブロック」全体がNAである場合にのみ削除したいと思います。この例では、mまたはzの値はないので、それらを削除する必要がありますが、2つのNAsを直列にドロップしたくないです。 – Corone

+0

それから@Arunはあなたの答えを持っていますが、 .logical'です。 – Justin

答えて

9

あなたはこれらのエントリを取得するには、この操作を行うことができる場所ALL ValueNAありません。

setkey(DT, "Series") 
DT[, .SD[(!all(is.na(Value)))], by=Series] 

!all周りの括弧は、マシューは(コメントを参照)になります構文は、参加しない回避するために必要されています。これと同じ:新しい明確質問に答えるためにその上

DT[, .SD[as.logical(!all(is.na(Value)))], by=Series] 

ビル:

しかし、順序を変更
allNA = function(x) all(is.na(x))  # define helper function 
for (i in c("Id","Series")) 
    DT = DT[, if (!any(sapply(.SD,allNA))) .SD else NULL, by=i] 
DT 
    Series Id Value1 Value2 
1:  i 1  1  1 
2:  i 2  2  2 
3:  i 3  3  3 
4:  b 5  5  2 
5:  b 6  6  3 
6:  f 5  5  2 
7:  f 6  6  3 
8:  j 5  5  5 
9:  j 6  6  6 
10:  c 7  7  4 
11:  c 8  8  NA 
12:  c 9  9  6 
13:  g 7  7  4 
14:  g 8  8  5 
15:  g 9  9  6 
16:  k 7  7  7 
17:  k 8  8  8 
18:  k 9  9  9 

。正確に結果が要求されているわけではありません。以下は注文を維持し、より速くなければなりません。

# starting fresh from original DT in question again 
DT[,drop:=FALSE] 
for (i in c("Series","Id")) 
    DT[,drop:=drop|any(sapply(.SD,allNA)),by=i] 
DT[(!drop)][,drop:=NULL][] 
    Series Id Value1 Value2 
1:  b 5  5  2 
2:  b 6  6  3 
3:  c 7  7  4 
4:  c 8  8  NA 
5:  c 9  9  6 
6:  f 5  5  2 
7:  f 6  6  3 
8:  g 7  7  4 
9:  g 8  8  5 
10:  g 9  9  6 
11:  i 1  1  1 
12:  i 2  2  2 
13:  i 3  3  3 
14:  j 5  5  5 
15:  j 6  6  6 
16:  k 7  7  7 
17:  k 8  8  8 
18:  k 9  9  9 
+0

なんらかの理由で、 '.SD [!all(is.na(Value))] 'は動作しません。 – Arun

+0

+1 '!' =参加していませんが、なぜそれがうまくいかないのか分かりません(論理的には違いないはずですが、おそらくリサイクルとの組み合わせではないのかもしれません) –

+1

今、わかりました。 '.SD [(!all(is.na(Value))]]'(paranthesisを使って)動作します! – Arun

10

complete.casesの機能はどうですか?

DT[complete.cases(DT),] 

それはNA

> DT[complete.cases(DT),] 
    Series Id Value1 Value2 
1:  b 4  4  1 
2:  b 5  5  2 
3:  b 6  6  3 
4:  c 7  7  4 
5:  c 8  8  5 
6:  c 9  9  6 
7:  f 4  4  1 
8:  f 5  5  2 
9:  f 6  6  3 
10:  g 7  7  4 
11:  g 8  8  5 
12:  g 9  9  6 
13:  j 4  4  1 
14:  j 5  5  2 
15:  j 6  6  3 
16:  k 7  7  4 
17:  k 8  8  5 
18:  k 9  9  6 
+0

ニース関数は便利ですが、私は "notempty.cases"関数を必要としています。 - 1つの列に対して完全に空のケースを削除し、他のNAを残してください。 – Corone

+4

OK、データセットの例を変更する必要があります。 NA値を持つすべての変数は、同じ文字の3行(値1と値2の両方)のNA値を持っているため、 –

+0

良い点、これを表示するために2つの余分なNAsを追加しました – Corone

関連する問題