web-dev-qa-db-ja.com

Rデータフレームをサブセットすると、不可解なNA行が生成されます

私はバグだと思うものに遭遇しました。それは大したことではありませんが、誰か他の人がこれを見たのか興味があります。残念ながら、私のデータは機密であるため、例を作成する必要があり、あまり役に立ちません。

データをサブセットするときに、元のデータフレームにない不思議なNA行をときどき取得します。行名もNAです。例えば:

example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z"))
example

  var1 var2
1    A    X
2    B    Y
3    A    Z

次に実行します:

example[example$var1=="A",]

  var1 var2
1    A    X
3    A    Z
NA<NA> <NA>

もちろん、上記の例では実際にこの不思議なNA行は得られません。ここに追加して、データで発生している問題を説明します。

多分、それは Googleのread.xlsxパッケージ を使用して元のデータセットをインポートし、サブセット化する前にワイドからロングへのリシェイプを実行するという事実に関係しているのかもしれません。

ありがとう

48
chrisg

条件をwhichでラップします。

df[which(df$number1 < df$number2), ]

仕組み:

条件が一致する行番号(条件がTRUE)を返し、それに応じてそれらの行のデータフレームをサブセット化します。

と言う:

which(df$number1 < df$number2)

行番号を返します1234および5

このように、書く:

df[which(df$number1 < df$number2), ]

書くのと同じです:

df[c(1, 2, 3, 4, 5), ]

または、さらに単純なバージョンは次のとおりです。

df[1:5, ]
41
c-urchin

これはOPによって既に回答されていることがわかりますが、彼のコメントはコメントセクションの奥深くに埋まっているので、この問題を修正するための私の試みです(少なくとも私のデータは同じように振る舞っていました)。

まず、いくつかのサンプルデータ:

> df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA))
> df
   name number1 number2
1     A       1      10
2     B       2       9
3     C       3       8
4     D       4       7
5     E       5       6
6     F       6       5
7     G       7       4
8     H       8       3
9     I       9      NA
10    J      10      NA

簡単なフィルターの場合:

> df[df$number1 < df$number2, ]
     name number1 number2
1       A       1      10
2       B       2       9
3       C       3       8
4       D       4       7
5       E       5       6
NA   <NA>      NA      NA
NA.1 <NA>      NA      NA

ここでの問題は、3番目の列にNAsがあると、Rが行全体をNAとして書き換えることです。それにもかかわらず、データフレームの寸法は維持されます。これは私の修正です。どの列にNAsが含まれているかを知る必要があります。

> df[df$number1 < df$number2 & !is.na(df$number2), ]
  name number1 number2
1    A       1      10
2    B       2       9
3    C       3       8
4    D       4       7
5    E       5       6
24
Waldir Leoncio

あなたが投稿したものと同様のコードを使用すると、同じ問題が発生します。関数subset()を使用する

subset(example,example$var1=="A")

nA行は代わりに除外されます。

11
user3612472

Dplyrの使用:

library(dplyr)
filter(df, number1 < number2)
4
Victor Yan
   > example <- data.frame("var1"=c("A", NA, "A"), "var2"=c("X", "Y", "Z"))
    > example
      var1 var2
    1    A    X
    2 <NA>    Y
    3    A    Z
    > example[example$var1=="A",]
       var1 var2
    1     A    X
    NA <NA> <NA>
    3     A    Z

おそらくこれはあなたが期待しているあなたの結果でなければならない... NAを避けるために条件の前にどの条件を使用して試してみてください

  example[which(example$var1=="A"),]
      var1 var2
    1    A    X
    3    A    Z

別の原因として、因子列がそのレベルにない値と等しいかどうかをチェックするなど、条件が間違っていることが考えられます。しばらく私を困らせた。

0
Jan Šimbera