Pertanyaan Membingungkan perilaku dalam tes logika sederhana diterapkan pada vektor nilai


Ok, ini membuat saya benar-benar bingung dan khawatir- Sebagai bagian dari rutinitas, saya telah mengklasifikasikan pengamatan individu dari variabel sebagai TRUE atau FALSE berdasarkan apakah nilainya di atas atau di bawah / sama dengan nilai median. Namun, saya telah mendapatkan perilaku di R yang sebagian besar tidak terduga dari melakukan tes sederhana ini.

Jadi, ambil kumpulan pengamatan ini:

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)

Bagi saya untuk mengklasifikasikan nilai-nilai ini, saya melakukan:

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

Saya tahu ada 1 trilyun cara untuk melakukan hal ini dengan lebih efisien, tetapi yang membuat saya khawatir adalah output dari ini tidak masuk akal. Karena tidak ada NaNs di set dan tes semua inklusif (> atau <=), Saya harus berakhir dengan daftar saja TRUE/FALSE nilai-nilai, tetapi saya mendapatkan:

[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"  

Lihat "1e-04"? Apa yang lebih aneh lagi, mari kita pilih nilai 69, salah satu yang mengembalikan nilai ganjil:

data[69]
>1e-04

Jika saya menguji nilai ini saja, saya mendapatkan apa yang saya harapkan:

data[69]<=data_med
TRUE

Bisakah seseorang menjelaskan perilaku ini? Sepertinya itu benar-benar berbahaya ...


4
2018-04-30 17:50


asal


Jawaban:


Mari berjalan melalui apa yang kamu lakukan di sini.

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"

Tetapi dengan melakukan ini Anda telah mengkonversi quant_data ke vektor karakter:

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

Sekarang perbandingan antara nilai karakter dan data_med nilainya hampir tidak berarti, karena data_med akan dipaksa untuk nilai karakter juga:

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

Apa yang Anda kira berarti untuk dilakukan (dan alasan untuk menetapkan quant_data=data) adalah:

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

Seperti yang ditunjukkan @Arun dalam komentar di atas, quant_data <- ifelse(data>data_med,"High","Low") akan bekerja juga. Begitu juga penggunaan yang tepat cut().


7
2018-04-30 17:56