Saya memiliki kerangka data dan saya ingin menghitung jumlah baris dalam setiap grup. Saya biasanya menggunakan aggregate
fungsi untuk menjumlahkan data sebagai berikut:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Sekarang, saya ingin menghitung pengamatan tetapi tidak dapat menemukan argumen yang tepat FUN
. Secara intuitif, saya pikir itu akan menjadi sebagai berikut:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Tapi, tidak beruntung.
Ada ide?
Beberapa data mainan:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
tidak bekerja untuk saya tetapiNROW
danlength
bekerja dengan baik. +1Jawaban:
Praktik terbaik saat ini (tidyverse) adalah:
sumber
cbind
hasilaggregate(Sepal.Length ~ Species, iris, mean)
danaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Mengikuti saran @ Joshua, berikut salah satu cara Anda dapat menghitung jumlah observasi dalam
df
kerangka data Anda di manaYear
= 2007 danMonth
= Nov (dengan asumsi mereka adalah kolom):dan dengan
aggregate
, mengikuti @GregSnow:sumber
dplyr
paket melakukan ini dengancount
/tally
commands, ataun()
fungsinya :Pertama, beberapa data:
Sekarang hitungannya:
Kami juga dapat menggunakan versi yang sedikit lebih panjang dengan pemipaan dan
n()
fungsinya:atau
tally
fungsinya:sumber
Pertanyaan lama tanpa
data.table
solusi. Jadi begini ...Menggunakan
.N
sumber
.()
sebagai gantilist()
dansetDT()
untuk mengubah data.frame menjadi data.table. Jadi dalam satu langkahsetDT(df)[, .N, by = .(year, month)]
.Opsi sederhana untuk digunakan dengan
aggregate
adalahlength
fungsi yang akan memberi Anda panjang vektor dalam subset. Terkadang sedikit lebih kuat untuk digunakanfunction(x) sum( !is.na(x) )
.sumber
Buat variabel baru
Count
dengan nilai 1 untuk setiap baris:Kemudian agregat dataframe, dijumlahkan dengan
Count
kolom:sumber
aggregate
, tidak ada kebutuhan untuk mengubah nama masing-masing variabel dalamby=
sepertilist(year=df1$year)
dlldata.frame
adalahlist
sudah begituaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
akan bekerja.Alternatif untuk
aggregate()
fungsi dalam kasus ini adalahtable()
denganas.data.frame()
, yang juga akan menunjukkan kombinasi Tahun dan Bulan mana yang terkait dengan kejadian nolDan tanpa kombinasi yang terjadi nol
sumber
Jika Anda ingin memasukkan 0 hitungan bulan-tahun yang hilang dalam data, Anda dapat menggunakan sedikit
table
keajaiban.Misalnya, mainan data.frame dalam pertanyaan, df1, tidak berisi observasi Januari 2014.
Fungsi dasar R
aggregate
tidak mengembalikan observasi untuk Januari 2014.Jika Anda ingin pengamatan bulan-tahun ini dengan 0 sebagai hitungan, maka kode di atas akan mengembalikan data.frame dengan jumlah untuk semua kombinasi bulan-tahun:
sumber
Untuk kumpulan saya, saya biasanya ingin melihat arti dan "seberapa besar grup ini" (alias panjangnya). Jadi ini cuplikan praktis saya untuk kesempatan itu;
sumber
SEBUAH sqlsolusi menggunakan
sqldf
paket:sumber
Mempertimbangkan jawaban @Ben, R akan membuat kesalahan jika
df1
tidak berisix
kolom. Tapi itu bisa diselesaikan dengan elegan denganpaste
:Demikian pula, dapat digeneralisasikan jika lebih dari dua variabel digunakan dalam pengelompokan:
sumber
Anda dapat menggunakan
by
fungsi karenaby(df1$Year, df1$Month, count)
itu akan menghasilkan daftar agregasi yang dibutuhkan.Outputnya akan terlihat seperti,
sumber
Sudah ada banyak jawaban bagus di sini, tetapi saya ingin menambahkan 1 opsi lagi bagi mereka yang ingin menambahkan kolom baru ke kumpulan data asli yang berisi berapa kali baris tersebut diulang.
Hal yang sama dapat dicapai dengan menggabungkan salah satu jawaban di atas dengan
merge()
fungsi.sumber
Jika Anda mencoba solusi agregat di atas dan Anda mendapatkan kesalahan:
jenis tidak valid (daftar) untuk variabel
Karena Anda menggunakan stempel tanggal atau waktu, coba gunakan as.character pada variabel:
Pada satu atau kedua variabel.
sumber