Saya memiliki bingkai data dengan dua kolom. Kolom pertama berisi kategori seperti "Pertama", "Kedua", "Ketiga", dan kolom kedua memiliki angka yang mewakili berapa kali saya melihat grup tertentu dari "Kategori".
Sebagai contoh:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Saya ingin mengurutkan data berdasarkan Kategori dan menjumlahkan semua Frekuensi:
Category Frequency
First 30
Second 5
Third 34
Bagaimana saya melakukan ini dalam R?
rowsum
.Jawaban:
Menggunakan
aggregate
:Pada contoh di atas, beberapa dimensi dapat ditentukan dalam
list
. Beberapa metrik teragregasi dari tipe data yang sama dapat dimasukkan melaluicbind
:(menanamkan komentar @thelatemail),
aggregate
memiliki antarmuka rumus jugaAtau jika Anda ingin menggabungkan beberapa kolom, Anda bisa menggunakan
.
notasi (juga berfungsi untuk satu kolom)atau
tapply
:Menggunakan data ini:
sumber
Anda juga dapat menggunakan paket dplyr untuk tujuan itu:
Atau, untuk beberapa kolom ringkasan (juga berfungsi dengan satu kolom):
Berikut adalah beberapa contoh tentang cara meringkas data dengan grup menggunakan fungsi dplyr menggunakan dataset bawaan
mtcars
:Untuk informasi lebih lanjut, termasuk
%>%
operator, lihat pengantar dplyr .sumber
funs()
argumensummarise_all
dan fungsi yang terkait (summarise_at
,summarise_if
)Jawaban yang diberikan oleh rcs berhasil dan sederhana. Namun, jika Anda menangani kumpulan data yang lebih besar dan membutuhkan peningkatan kinerja ada alternatif yang lebih cepat:
Mari kita bandingkan dengan hal yang sama menggunakan data.frame dan yang di atas:
Dan jika Anda ingin menyimpan kolom ini adalah sintaks:
Perbedaannya akan menjadi lebih terlihat dengan kumpulan data yang lebih besar, karena kode di bawah ini menunjukkan:
Untuk beberapa agregasi, Anda dapat menggabungkan
lapply
dan.SD
sebagai berikutsumber
data[, sum(Frequency), by = Category]
. Anda bisa menggunakan fungsi.N
pengganti yang manasum()
.data[, .N, by = Category]
. Berikut ini adalah lembar contekan yangAnda juga dapat menggunakan fungsi by () :
Paket-paket lain (plyr, membentuk kembali) memiliki manfaat mengembalikan data.frame, tetapi layak untuk dikenali oleh () karena itu adalah fungsi dasar.
sumber
Beberapa tahun kemudian, hanya untuk menambahkan solusi R dasar sederhana yang tidak hadir di sini untuk beberapa alasan-
xtabs
Atau jika Anda ingin
data.frame
kembalisumber
sumber
Jika
x
bingkai data dengan data Anda, maka hal berikut akan melakukan apa yang Anda inginkan:sumber
Sementara saya baru-baru ini menjadi konversi
dplyr
untuk sebagian besar jenis operasi ini,sqldf
paket itu masih sangat bagus (dan IMHO lebih mudah dibaca) untuk beberapa hal.Berikut adalah contoh bagaimana pertanyaan ini dapat dijawab
sqldf
sumber
Hanya untuk menambahkan opsi ketiga:
EDIT: ini adalah jawaban yang sangat lama. Sekarang saya akan merekomendasikan penggunaan
group_by
dansummarise
daridplyr
, seperti pada jawaban @docendo.sumber
Saya merasa
ave
sangat membantu (dan efisien) ketika Anda perlu menerapkan fungsi agregasi yang berbeda pada kolom yang berbeda (dan Anda harus / ingin tetap pada basis R):misalnya
Diberikan masukan ini:
kami ingin kelompok dengan
Categ1
danCateg2
dan menghitung jumlahSamples
dan rata-rata dariFreq
.Berikut adalah solusi yang mungkin menggunakan
ave
:Hasil:
sumber
Yang baru ditambahkan
dplyr::tally()
sekarang menjadikan ini lebih mudah dari sebelumnya:sumber
Anda bisa menggunakan fungsi
group.sum
dari paket Rfast .Rfast memiliki banyak fungsi kelompok dan
group.sum
merupakan salah satunya.sumber
menggunakan
cast
bukanrecast
(catatan'Frequency'
sekarang'value'
)mendapatkan:
sumber
Solusi lain yang mengembalikan jumlah oleh kelompok dalam matriks atau bingkai data dan pendek dan cepat:
sumber
Karena
dplyr 1.0.0
,across()
fungsi tersebut dapat digunakan:Jika tertarik pada banyak variabel:
Dan pemilihan variabel menggunakan pembantu pilih:
Contoh data:
sumber