Saya memiliki vektor angka:
numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
453,435,324,34,456,56,567,65,34,435)
Bagaimana saya bisa meminta R menghitung berapa kali nilai x muncul dalam vektor?
Anda bisa menggunakan table()
:
> a <- table(numbers)
> a
numbers
4 5 23 34 43 54 56 65 67 324 435 453 456 567 657
2 1 2 2 1 1 2 1 2 1 3 1 1 1 1
Kemudian Anda dapat mengelompokkannya:
> a[names(a)==435]
435
3
Atau mengubahnya menjadi data.frame jika Anda lebih nyaman bekerja dengan itu:
> as.data.frame(table(numbers))
numbers Freq
1 4 2
2 5 1
3 23 2
4 34 2
...
a["435"]
inseteada[names(a)==435]
?Cara paling langsung adalah
sum(numbers == x)
.numbers == x
menciptakan vektor logis yang BENAR di setiap lokasi yang terjadi x, dan ketikasum
ing, vektor logis dipaksa untuk numerik yang mengubah BENAR ke 1 dan SALAH ke 0.Namun, catatan bahwa untuk angka floating point lebih baik untuk penggunaan sesuatu seperti:
sum(abs(numbers - x) < 1e-6)
.sumber
x
dalam data daripada nilai yang diketahui spesifikx
. Agar adil, itulah pertanyaan aslinya. Seperti yang saya katakan dalam jawaban saya di bawah, "Saya merasa jarang saya ingin mengetahui frekuensi satu nilai dan tidak semua nilai ..."Saya mungkin akan melakukan sesuatu seperti ini
Tapi sungguh, cara yang lebih baik adalah
sumber
table(numbers)
akan melakukan lebih banyak pekerjaan daripada solusi termudahsum(numbers==x)
,, karena itu akan mencari tahu jumlah semua angka lain dalam daftar juga.Ada juga
count(numbers)
dariplyr
paket. Jauh lebih nyaman daripadatable
menurut saya.sumber
Solusi pilihan saya menggunakan
rle
, yang akan mengembalikan nilai (label,x
dalam contoh Anda) dan panjang, yang menunjukkan berapa kali nilai tersebut muncul secara berurutan.Dengan menggabungkan
rle
dengansort
, Anda memiliki cara yang sangat cepat untuk menghitung berapa kali nilai muncul. Ini bisa membantu dengan masalah yang lebih kompleks.Contoh:
Jika nilai yang Anda inginkan tidak muncul, atau Anda perlu menyimpan nilai itu untuk nanti, buat
a
adata.frame
.Saya merasa jarang bahwa saya ingin mengetahui frekuensi satu nilai dan tidak semua nilai, dan rle tampaknya menjadi cara tercepat untuk mendapatkan hitungan dan menyimpan semuanya.
sumber
c(rep('A', 3), rep('G', 4), 'A', rep('G', 2), rep('C', 10))
mau kembalivalues = c('A','G','A','G','C')
danlengths=c(3, 4, 1, 2, 10)
mana yang kadang berguna.table
lebih cepatwhen the vector is long
(saya mencoba 100000) tetapi sedikit lebih lama ketika lebih pendek (saya mencoba 1000)Ada fungsi standar dalam R untuk itu
tabulate(numbers)
sumber
tabulate
adalah Anda tidak bisa berurusan dengan angka nol dan negatif.tabulate
. Catatan:sort
tampaknya diperlukan untuk penggunaan yang benar secara umum:tabulate(sort(numbers))
.sumber
inilah salah satu cara cepat dan kotor:
sumber
Jika Anda ingin menghitung jumlah penampilan selanjutnya, Anda dapat menggunakan
sapply
fungsi ini:Keluaran:
sumber
Anda dapat mengubah nomornya menjadi apa pun yang Anda inginkan di baris berikut
sumber
Satu lagi cara yang menurut saya nyaman adalah:
Ini mengubah dataset menjadi faktor, dan kemudian ringkasan () memberi kita total kontrol (jumlah nilai unik).
Output adalah:
Ini dapat disimpan sebagai kerangka data jika diinginkan.
di sini row.names telah digunakan untuk mengubah nama nama baris. tanpa menggunakan row.names, nama kolom dalam s digunakan sebagai nama baris dalam bingkai data baru
Output adalah:
sumber
Menggunakan tabel tetapi tanpa membandingkan dengan
names
:table
berguna ketika Anda menggunakan jumlah elemen yang berbeda beberapa kali. Jika Anda hanya perlu satu hitungan, gunakansum(numbers == x)
sumber
Ada berbagai cara penghitungan elemen tertentu
sumber
Metode yang relatif cepat pada vektor panjang dan memberikan output yang nyaman adalah dengan menggunakan
lengths(split(numbers, numbers))
(perhatikan S pada akhirlengths
):Outputnya hanyalah sebuah vektor bernama.
Kecepatan muncul sebanding dengan yang
rle
diusulkan oleh JBecker dan bahkan sedikit lebih cepat pada vektor yang sangat panjang. Berikut ini adalah microbenchmark dalam R 3.6.2 dengan beberapa fungsi yang diusulkan:Yang penting, satu-satunya fungsi yang juga menghitung jumlah nilai yang hilang
NA
adalahplyr::count
. Ini juga dapat diperoleh secara terpisah menggunakansum(is.na(vec))
sumber
Ini adalah solusi yang sangat cepat untuk vektor atom satu dimensi. Itu bergantung
match()
, sehingga kompatibel denganNA
:Anda juga dapat mengubah algoritme agar tidak berjalan
unique()
.Dalam kasus di mana output itu diinginkan, Anda mungkin bahkan tidak memerlukannya untuk mengembalikan kembali vektor asli, dan kolom kedua mungkin semua yang Anda butuhkan. Anda bisa mendapatkannya dalam satu baris dengan pipa:
sumber
Hal ini dapat dilakukan dengan
outer
mendapatkan metriks kesetaraan diikuti olehrowSums
, dengan makna yang jelas.Untuk memiliki jumlah dan
numbers
dalam dataset yang sama, sebuah data.frame pertama kali dibuat. Langkah ini tidak diperlukan jika Anda ingin input dan output terpisah.sumber