2017-10-22 21 views
1

私はRの初心者です。私のコードでは特殊なケースをデバッグしようとしています。 次の行では、確かに存在する列に基づいてベクトルxがソートされています。当然、私はsorted.dataが同じであると予想して、ほとんどの場合そうです。order of()in return type()in R

print (paste("x=",typeof(x))) 
print (x) 
sorted.data <- x[order(x[[max.column]]), ] 
print (paste("type of sorted=", typeof(sorted.data))) 
print (sorted.data) 

ほとんどの場合、上記のコードの出力は次のようになります。

[1] "x= list" 
    V1 V5 
8 10 0 
16 7 0 
18 7 0 
20 1 96 
24 9 0 

[1] "type of sorted= list" 
    V1 V5 
8 10 0 
16 7 0 
18 7 0 
24 9 0 
31 5 0 

しかし、いくつかの点で、出力は次のようになります。

[1] "x= list" # Expected. a vector with 1 column 
    V1 
8 10 
16 7 
18 7 
24 9 
26 10 

[1] "type of sorted= integer" # This shouldn't happen 
[1] 0 0 0 1 1 1 1 2 2 3 3 4 4 4 

間違って行くことができるもの?なぜ戻り値が変わるのですか?

+2

'のX [順序([[max.column]] x)は、]'本当に 'list'であればうまくいかないはずです。それは' data.frame'ではないと確信していますか? (これは、とにかくここに表示されている方法です)。これは 'data.frame'と仮定し、行を索引付けする際のデフォルトのモードです。*結果は最小の可能次元に強制されます* *それはベクトルに強制されます。 'x [order(x [[max.column]]),, drops = TRUE]'を試してください。 ( '' help( "[[" ''](https://stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html)を参照してください。) – r2evans

+1

@ r2evans実際には、 drop = FALSE'でなければなりません。 (ちょうどそれをテストしました) 'sorted.data < - x [order(x [[ncol(x)])、、drop = FALSE]'。 –

+1

もちろん...両方の面をテストして、間違ったものをコピー/貼り付け、確認してください。 – r2evans

答えて

2

まず、あなたのデータはdata.frameとよく似ていて、listと非常によく似ています。本当にdata.frameでなかった場合は、コンマの索引付け(x[order(x[[max.column]]), ])は機能しないはずですので、data.frameと仮定しています。私はdata.frameインデックス(とarray秒、あまりにも)と時折イライラ見つける

ことの一つは、デフォルトの動作はhelp("[")から抽出)「結果は可能な限り低い次元に強制変換された」ということです。つまり、索引付けが1つの列(または行)のみになる場合は、ベクトルとして戻されます。これを先取りするために、あなたのインデックスに,drop=FALSEを追加します。

x[order(x[[max.column]]),,drop=FALSE] 

(上記の私の誤ったコメントを補正するためのルイBarradasに感謝します。)