4

わかりました、これは私を完全に困惑させ、心配させます-ルーチンの一部として、変数の個々の観測値を、それらの値が中央値より上か下か、またはそれに等しいかに基づいTRUEて分類してきました。FALSEただし、この単純なテストを実行すると、R で予想外の動作が発生することがあります。

したがって、次の一連の観察を行います。

data=c(0.6666667, 0.8333, 0.6666667, 0.8333, 0.8333, 0.75, 0.9999, 0.7499667, 0.25, 0.6666667, 0.1667, 0.7499667, 0.5, 0.2500333, 0.3333667, 0.0834, 0.0001, 0.2500333, 0.8333, 0.9999, 0.9999, 0.2500333, 0.2500333, 0.3333667, 0.9166, 0.5, 0.2500333, 0.4166667, 0.0001, 0.1667333, 0.6666333, 0.0834, 0.1667, 0.6666333, 0.9166, 0.1667, 0.7499333, 0.9166, 0.9166, 0.9166, 0.7499667, 0.7499667, 0.4166667, 0.5, 0.2500333, 0.9166, 0.6666667, 0.1667333, 0.25, 0.0001, 0.3333667, 0.0001, 0.25, 0.0834, 0.9999, 0.0834, 0.1667, 0.5, 0.2500333, 0.3333667, 0.9166, 0.9166, 0.8333, 0.9166, 0.75, 0.0834, 0.4166667, 0.5, 0.0001, 0.9999, 0.8333, 0.6666667, 0.9166)

これらの値を分類するために、次のことを行いました。

data_med=median(data)
quant_data=data
quant_data[quant_data>data_med]="High"
quant_data[quant_data<=data_med]="Low"

これをより効率的に行う方法が無数にあることは知っていますが、私が心配しているのは、これからの出力が意味をなさないことです。セットには sがなくNaN、テストはすべて包括的 (>または) であるため、最終的に/値<=のみのリストになるはずですが、代わりに次のようになります。TRUEFALSE

[1] "High"  "High"  "High"  "High"  "High"  "High"  "High"  "High"  "Low"   "High"  "Low"   "High"  "Low"   "Low"   "Low"   "Low"   "1e-04"
[18] "Low"   "High"  "High"  "High"  "Low"   "Low"   "Low"   "High"  "Low"   "Low"   "Low"   "1e-04" "Low"   "High"  "Low"   "Low"   "High" 
[35] "High"  "Low"   "High"  "High"  "High"  "High"  "High"  "High"  "Low"   "Low"   "Low"   "High"  "High"  "Low"   "Low"   "1e-04" "Low"  
[52] "1e-04" "Low"   "Low"   "High"  "Low"   "Low"   "Low"   "Low"   "Low"   "High"  "High"  "High"  "High"  "High"  "Low"   "Low"   "Low"  
[69] "1e-04" "High"  "High"  "High"  "High"  

「1e-04」が見えますか?さらに奇妙なことに、奇妙な値を返す値の 1 つである値 69 を選びましょう。

data[69]
>1e-04

この値を単独でテストすると、期待どおりの結果が得られます。

data[69]<=data_med
TRUE

誰かがこの動作を説明できますか? 一見危なそうな…。

4

1 に答える 1

7

ここで行ったことを見ていきましょう。

data=c(0.6666667, 0.8333, 0.6666667, 0.8333, 0.8333, 0.75, 0.9999, 0.7499667, 0.25, 0.6666667, 0.1667, 0.7499667, 0.5, 0.2500333, 0.3333667, 0.0834, 0.0001, 0.2500333, 0.8333, 0.9999, 0.9999, 0.2500333, 0.2500333, 0.3333667, 0.9166, 0.5, 0.2500333, 0.4166667, 0.0001, 0.1667333, 0.6666333, 0.0834, 0.1667, 0.6666333, 0.9166, 0.1667, 0.7499333, 0.9166, 0.9166, 0.9166, 0.7499667, 0.7499667, 0.4166667, 0.5, 0.2500333, 0.9166, 0.6666667, 0.1667333, 0.25, 0.0001, 0.3333667, 0.0001, 0.25, 0.0834, 0.9999, 0.0834, 0.1667, 0.5, 0.2500333, 0.3333667, 0.9166, 0.9166, 0.8333, 0.9166, 0.75, 0.0834, 0.4166667, 0.5, 0.0001, 0.9999, 0.8333, 0.6666667, 0.9166)



data_med=median(data)  ## 0.5
quant_data=data        ## irrelevant
quant_data[quant_data>data_med]="High"

しかし、これを行うことで、quant_data を文字ベクトルに変換しました

str(quant_data)
##  chr [1:73] "High" "High" "High" "High" "High" "High" "High" ...

文字値と値の比較は、文字値にも強制されるdata_medため、ほとんど意味がありません。data_med

"High" < "0.5"  ## FALSE
"1e-4" < "0.5"  ## FALSE -- this is your problem.
quant_data[quant_data<=data_med]="Low"

おそらく何をするつもりだったのか (そして を割り当てる理由quant_data=data) は次のとおりでした:

quant_data[data>data_med]="High"
quant_data[data<=data_med]="Low"
table(quant_data)
## High  Low 
##   35   38 

上記のコメントで@Arunが指摘しているように、うまくいくquant_data <- ifelse(data>data_med,"High","Low")でしょう。の適切な使用も同様ですcut()

于 2013-04-30T17:56:14.977 に答える