私はバグだと思うものに遭遇しました。それは大したことではありませんが、誰か他の人がこれを見たのか興味があります。残念ながら、私のデータは機密であるため、例を作成する必要があり、あまり役に立ちません。
データをサブセットするときに、元のデータフレームにない不思議な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パッケージ を使用して元のデータセットをインポートし、サブセット化する前にワイドからロングへのリシェイプを実行するという事実に関係しているのかもしれません。
ありがとう
条件をwhich
でラップします。
df[which(df$number1 < df$number2), ]
仕組み:
条件が一致する行番号(条件がTRUE
)を返し、それに応じてそれらの行のデータフレームをサブセット化します。
と言う:
which(df$number1 < df$number2)
行番号を返します1
、2
、3
、4
および5
。
このように、書く:
df[which(df$number1 < df$number2), ]
書くのと同じです:
df[c(1, 2, 3, 4, 5), ]
または、さらに単純なバージョンは次のとおりです。
df[1:5, ]
これは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番目の列にNA
sがあると、Rが行全体をNA
として書き換えることです。それにもかかわらず、データフレームの寸法は維持されます。これは私の修正です。どの列にNA
sが含まれているかを知る必要があります。
> 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
あなたが投稿したものと同様のコードを使用すると、同じ問題が発生します。関数subset()を使用する
subset(example,example$var1=="A")
nA行は代わりに除外されます。
Dplyrの使用:
library(dplyr)
filter(df, number1 < number2)
> 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
別の原因として、因子列がそのレベルにない値と等しいかどうかをチェックするなど、条件が間違っていることが考えられます。しばらく私を困らせた。