Bagaimana cara ddply membagi data?

Saya memiliki bingkai data ini.

mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")

Saya mencoba untuk mendapatkan pemahaman yang lebih baik tentang cara kerja ddply.

Saya ingin mendapatkan panjang dan kecepatan rata-rata untuk setiap pasangan model dan kelas.

Saya tahu ini salah satu cara untuk melakukannya: ddply(mydf, .(Model, Class), .fun = summarize, mSpeed = mean(Speed), mLength = mean(Length)).

Saya ingin tahu apakah saya bisa mendapatkan mean menggunakan ddply dan tanpa menentukannya satu per satu.

Saya mencoba ddply(mydf, .(Model, Class), .fun = mean) tetapi saya mendapatkan kesalahan

Pesan peringatan: 1: In mean.default(piece, ...) : argumen bukan numerik atau logis: mengembalikan NA

Apa yang ddply sampaikan pada argumen fungsi? Apakah ada cara untuk menerapkan satu fungsi ke setiap kolom menggunakan ddply?

Tujuan saya adalah mempelajari lebih lanjut tentang ddply. Saya hanya akan menerima jawaban ddply


person ivan    schedule 16.04.2019    source sumber
comment
Dalam contoh pertama Anda, Anda memanggil summarize, yang mengharapkan sebuah bingkai; argumen selanjutnya (mSpeed, ...) kemudian menjadi argumen ke summarize, sehingga panggilan yang dihasilkan mungkin summarize(x, mSpeed=mean(Speed), mLength=mean(Length)). Pada panggilan kedua, Anda mencoba meneruskan frame penuh ke mean, padahal sebenarnya hanya menginginkan vektor. Saya tidak tahu mengapa Anda lebih memilih menentukannya satu per satu (karena tidak akan lebih cepat), tetapi ddply(mydf, .(Model, Class), .fun = summarize, mSpeed=mean(Speed)) adalah satu per satu.   -  person r2evans    schedule 17.04.2019
comment
Maksud saya adalah bahwa mSpeed ​​hanya memberi saya rata-rata kecepatan. Bagaimana jika mydf memiliki 20 kolom numerik. Bisakah saya menggunakannya untuk mendapatkan mean dari masing-masing kolom tersebut, dibagi berdasarkan Model dan Kelas   -  person ivan    schedule 17.04.2019


Jawaban (1)


Berikut solusi menggunakan fungsi dplyr dan summarize.



library(dplyr)


mydf<- data.frame(c("a","a","b","b","c","c"),c("e","e","e","e","e","e")
                  ,c(1,2,3,10,20,30),
                  c(5,10,20,20,15,10))
colnames(mydf)<-c("Model", "Class","Length", "Speed")

#summarize data by Model & Class
mydf %>%  group_by(Model, Class) %>% summarize_if(is.numeric, mean)


#> # A tibble: 3 x 4
#> # Groups:   Model [3]
#>   Model Class Length Speed
#>   <fct> <fct>  <dbl> <dbl>
#> 1 a     e        1.5   7.5
#> 2 b     e        6.5  20  
#> 3 c     e       25    12.5

Dibuat pada 16-04-2019 oleh paket reprex (v0.2.1)

person Ryan John    schedule 16.04.2019
comment
Silakan lihat pembaruan saya pada postingan tersebut. Saya ingin melakukannya dengan ddply. - person ivan; 17.04.2019