Saya memiliki bingkai data R seperti ini:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Saya perlu mendapatkan bingkai data dalam formulir berikut:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
Nomor grup dapat bervariasi, tetapi nama dan jumlahnya dapat diperoleh dengan menelepon levels(factor(data$group))
Manipulasi apa yang harus dilakukan dengan data untuk mendapatkan hasilnya?
r
data-transformation
Yuriy Petrovskiy
sumber
sumber
aggregate
,,tapply
lalu stackoverflow.com untuk pertanyaan koding selanjutnya dari jenis ini.Jawaban:
Berikut adalah varian satu baris plyr menggunakan ddply :
Berikut ini varian satu baris lainnya menggunakan data.table paket baru .
Yang ini lebih cepat, meskipun ini hanya terlihat di atas meja dengan 100 ribu baris. Pengaturan waktu pada Macbook Pro saya dengan prosesor 2,53 Ghz Core 2 Duo dan R 2.11.1:
Penghematan lebih lanjut dimungkinkan jika kita menggunakan
setkey
:sumber
dt <- data.table(dtf)
alih-alihdt <- data.table(dt)
di blok kode kedua. Dengan begitu, Anda membuat tabel data dari bingkai data alih-alih daridt
fungsi daristats
paket. Saya mencoba mengeditnya, tetapi saya tidak dapat melakukan pengeditan di bawah enam karakter.data.table
adalah cara terbaik untuk mengumpulkan data dan jawaban ini bagus, tetapi masih hanya menggores permukaan. Selain unggul secara sintaksis, ini juga sangat fleksibel dan memiliki banyak fitur canggih yang melibatkan sambungan dan mekanisme internal. Lihat FAQ, halaman github, atau kursus untuk info lebih lanjut.Salah satu kemungkinan adalah menggunakan fungsi agregat . Misalnya,
memberi Anda kolom kedua dari hasil yang diinginkan.
sumber
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))
tetapi saya tidak yakin itu adalah cara yang benar. Saya tidak yakin apa yang akan terjadi maka hasil kolom yang diikat akan berada dalam urutan yang berbeda (saya pikir itu mungkin). Apa pendapat Anda?aggregate()
:aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))
Karena Anda memanipulasi bingkai data,
dplyr
paket mungkin merupakan cara tercepat untuk melakukannya.atau setara, menggunakan operator
dplyr
/magrittr
pipa:EDIT penggunaan penuh operator pipa:
sumber
dplyr
. Ini telah membuat begitu banyak tugas R sederhana dan banyak dari metode ini menjadi usang.plyr
bukandplyr
yang menyebabkan masalah.Hebat, terima kasih bquast untuk menambahkan solusi dplyr!
Ternyata itu, dplyr dan data.table sangat dekat:
data.table masih yang tercepat, diikuti dengan sangat erat oleh dplyr (), yang menariknya tampak lebih cepat pada data.frame daripada data.table:
sumber
Selain saran yang ada, Anda mungkin ingin memeriksa
describe.by
fungsi dalampsych
paket.Ini menyediakan sejumlah statistik deskriptif termasuk rata-rata dan standar deviasi berdasarkan variabel pengelompokan.
sumber
Saya telah menemukan fungsi
summaryBy
dalam paket doBy menjadi yang paling nyaman untuk ini:sumber
Gunakan
sqldf
paket. Ini memungkinkan Anda sekarang menggunakan SQL untuk meringkas data. Setelah Anda memuatnya, Anda dapat menulis sesuatu seperti -sumber
Diedit: Sesuai dengan saran chl
Fungsi yang Anda cari disebut "tapply" yang menerapkan fungsi per grup yang ditentukan oleh faktor.
Saya benar-benar menyarankan untuk bekerja melalui tutorial R dasar yang menjelaskan semua datastructures dan metode yang umum digunakan. Kalau tidak, Anda akan terjebak setiap inci selama pemrograman. Lihat pertanyaan ini untuk koleksi sumber daya gratis yang tersedia.
sumber
for
loop di sini, Anda dapat membuat inframe dataframe Anda, IMO. Untuktapply
panggilan, gunakanfunction(x) c(mean(x),sd(x)))
dancbind
hasilnya sebagai OP meminta kedua statistik. Juga,ddply
dari paket plyr dapat melakukan ini dengan lancar.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (grup = level (faktor (data $ grup)), "berarti" = mperage, "stdev" = stperage) `benar?Berikut adalah contoh dengan fungsi yang
aggregates()
saya lakukan sendiri beberapa waktu lalu:Ini memberikan hasil sebagai berikut:
Mungkin Anda bisa mendapatkan hasil yang sama mulai dari fungsi R split ():
Biarkan saya kembali ke output
aggregates
fungsi. Anda bisa mengubahnya dalam tabel yang indah menggunakanreshape()
,xtabs()
danftable()
:Ini memberi:
Cantik bukan? Anda dapat mengekspor tabel ini ke pdf dengan
textplot()
fungsigplots
paket.Lihat di sini untuk solusi orang lain.
sumber