Ada beberapa masalah ketika vektor logis berisi NA
nilai.
Lihat misalnya:
z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
Jadi saya pikir yang paling aman adalah menggunakan na.rm = TRUE
:
sum(z, na.rm = TRUE) # best way to count TRUE values
(yang memberi 1). Saya pikir table
solusi itu kurang efisien (lihat kode table
fungsi).
Juga, Anda harus berhati-hati dengan solusi "tabel", jika tidak ada nilai yang BENAR dalam vektor logis. Misalkan z <- c(NA, FALSE, NA)
atau sederhananya z <- c(FALSE, FALSE)
, lalu table(z)["TRUE"]
memberi Anda NA
untuk kedua kasus.
table(c(FALSE))["TRUE"]
memberi NA, bukan 0.sum(z, na.rm = TRUE)
Opsi lain yang belum disebutkan adalah menggunakan
which
:Hanya untuk benar-benar memberikan beberapa konteks pada "pertanyaan yang lebih cepat", selalu termudah hanya untuk menguji diri sendiri. Saya membuat vektor lebih besar untuk perbandingan:
Jadi jelas menggunakan
sum
adalah pendekatan terbaik dalam hal ini. Anda mungkin juga ingin memeriksaNA
nilai - nilai seperti yang disarankan Marek.Hanya untuk menambahkan catatan tentang nilai NA dan
which
fungsinya:Perhatikan bahwa yang hanya memeriksa logis
TRUE
, jadi pada dasarnya mengabaikan nilai-nilai non-logis.sumber
Cara lain adalah
Meskipun
sum(z)
bagus dan pendek, bagi sayalength(z[z==TRUE])
lebih menjelaskan diri sendiri. Padahal, saya pikir dengan tugas sederhana seperti ini tidak benar-benar membuat perbedaan ...Jika ini adalah vektor besar, Anda mungkin harus menggunakan solusi tercepat, yaitu
sum(z)
.length(z[z==TRUE])
sekitar 10x lebih lambat dantable(z)[TRUE]
sekitar 200x lebih lambat darisum(z)
.Kesimpulannya,
sum(z)
adalah yang tercepat untuk mengetik dan mengeksekusi.sumber
which
adalah alternatif yang baik, terutama ketika Anda beroperasi pada matriks (periksa?which
dan perhatikanarr.ind
argumennya). Tapi saya sarankan Anda tetap dengansum
, karenana.rm
argumen yang dapat menanganiNA
dalam vektor logis. Misalnya:Jika Anda ketik
sum(x)
Anda akan mendapatkanNA
akibatnya, tetapi jika Anda lulusna.rm = TRUE
disum
fungsi, Anda akan mendapatkan hasil yang Anda inginkan.Apakah pertanyaan Anda benar-benar teoretis, atau Anda memiliki masalah praktis tentang vektor-vektor logis?
sumber
Pilihan lain adalah menggunakan fungsi ringkasan. Ini memberikan ringkasan dari Ts, Fs dan NAS.
sumber
summary(hival)["TRUE"]
:;Saya telah melakukan sesuatu yang serupa beberapa minggu yang lalu. Inilah solusi yang mungkin, ini ditulis dari awal, jadi ini semacam rilis beta atau semacamnya. Saya akan mencoba memperbaikinya dengan menghapus loop dari kode ...
Gagasan utamanya adalah menulis fungsi yang akan mengambil 2 (atau 3) argumen. Yang pertama adalah
data.frame
yang menyimpan data yang dikumpulkan dari kuesioner, dan yang kedua adalah vektor numerik dengan jawaban yang benar (ini hanya berlaku untuk kuesioner pilihan tunggal). Atau, Anda bisa menambahkan argumen ketiga yang akan mengembalikan vektor numerik dengan skor akhir, atau data.frame dengan skor tertanam.Saya akan mencoba melakukan ini dengan cara yang lebih elegan dengan beberapa fungsi * ply. Perhatikan bahwa saya tidak mengajukan
na.rm
argumen ... Akan melakukan ituSekarang terapkan fungsi:
Jika Anda melewatkan argumen data.frame, itu akan mengembalikan data.frame yang dimodifikasi. Saya akan mencoba untuk memperbaiki ini ... Semoga ini bisa membantu!
sumber
rowSums(t(t(d)==sol), na.rm=TRUE)
. R recycle vector untuk perbandingan. Jika Andad
adalah matriks dengan kasus dalam kolom maka disederhanakan menjadirowSums(d==sol, na.rm=TRUE)
.Saya baru saja mengalami masalah tertentu di mana saya harus menghitung jumlah pernyataan benar dari vektor logis dan ini bekerja paling baik untuk saya ...
Jadi ini mengambil subset dari objek gene.rep.matrix, dan menerapkan tes logis, mengembalikan vektor logis. Vektor ini diletakkan sebagai argumen untuk grep, yang mengembalikan lokasi entri yang BENAR. Panjang kemudian menghitung berapa banyak entri menemukan grep, sehingga memberikan jumlah entri BENAR.
sumber
Ada juga paket yang disebut
bit
yang dirancang khusus untuk operasi boolean cepat. Ini sangat berguna jika Anda memiliki vektor besar atau perlu melakukan banyak operasi boolean.sumber