2017-09-29 1 views
0

ここで何が起こっているのか理解していないと、以下のデータフレームを並べる両方の方法が同等であると思われます。サブセット化されたデータフレームを渡すときに、Rのorder()がNAsを生成するのはなぜですか?

当社のデータフレーム、今

cols <- c("chr","id","value") 
df <- data.frame(c(1:5),c("ENSG1","ENSG2","ENSG3","ENSG4","ENSG5"),runif(5,5.0,10.0)) 
names(df) <- cols 
df <- df[sample(nrow(df)),] 
df 

chr id value 
5  ENSG5 8.913645 
2  ENSG2 6.117744 
4  ENSG4 8.558403 
3  ENSG3 9.625546 
1  ENSG1 6.105577 

、方法1:

方法、のようにorder()にDF列を渡しながら、いくつかの好奇心が強い理由のNAにスロー

df[order(df[,c("chr","id")]),] 

chr id value 
1  ENSG1 6.105577 
2  ENSG2 6.117744 
3  ENSG3 9.625546 
4  ENSG4 8.558403 
5  ENSG5 8.913645 
NA <NA>  NA 
NA <NA>  NA 
NA <NA>  NA 
NA <NA>  NA 
NA <NA>  NA 

2:

df[order(df$chr,df$id),] 

chr id value 
1  ENSG1 6.105577 
2  ENSG2 6.117744 
3  ENSG3 9.625546 
4  ENSG4 8.558403 
5  ENSG5 8.913645 

はそうではありません。

誰かが方法1と方法2を交換できない理由を説明できますか?

+1

これは、 'order'が' df'を 'matrix'に強制してそれをソートしているからです。 'R'の行列は' dim'属性を持つベクトルだけなので、出力は最初の列の次に2番目の列の順序が続きます。だから、 'df'を指すものは長さ10のベクトルです。' df'だけで 'order'を実行し、その結果を見てください。 –

+0

データフレームでは機能しないため、サブセット化されたデータフレームでは注文は機能しません。ベクトルで呼び出すときに機能します(ちょうどあなたのデータフレームの列である)。 – Gregor

答えて

1

我々は?orderを見てみると、それは最初の引数は以下のように記述されています:

数値、複雑な、文字または論理ベクトル、同じ長さのすべて、または分類Rオブジェクトのシーケンス。

実際にデータフレームで動作することはありません。 「分類されたRオブジェクト」は少し曖昧であり、データフレームがエラーを投げることはないが、確かに「またはデータフレーム」とは言わない。

説明は言う:

あなたはorderまたはデータフレームを呼び出すと、あなたが見ることができる

など、データフレームをソートするために、これらの関数を使用する方法の例を参照してください何が起こるのですか:

order(data.frame(a = 1:5, b = 5:1)) 
# [1] 1 10 2 9 3 8 4 7 5 6 

データフレームをベクトルに強制するように見えます。ordそれers。一般的にはあまり役に立ちません。このため、df[order(df[,c("chr","id")]),]を実行すると、NA行が得られます。あなたの入力データフレームは2列であり、従ってorder()出力はデータフレームの2倍の行を持っていました。

実際のベクトルをorderに与えるデータフレームを注文する正しい方法を既に見つけました。ベクトルはデータフレームの個々の列でも、正しい長さの他のベクトルでもかまいません。

関連する問題