Keraguan tentang fungsi ddply di R

Saya mencoba melakukan ringkasan group by yang setara di R melalui fungsi plyr bernama ddply. Saya memiliki bingkai data yang memiliki tiga kolom (misalnya id, period dan event). Lalu, saya ingin menghitung berapa kali setiap id muncul di bingkai data (count(*)... group by id dengan SQL) dan mendapatkan elemen terakhir dari setiap id yang sesuai dengan kolom event.

Berikut contoh apa yang saya miliki dan apa yang saya coba peroleh:

  id period event #original data frame
  1      1     1
  2      1     0
  2      2     1
  3      1     1
  4      1     1
  4      1     0

  id  t  x #what I want to obtain
  1   1  1
  2   2  1
  3   1  1
  4   2  0

Ini adalah kode sederhana yang saya gunakan untuk itu:

 teachers.pp<-read.table("http://www.ats.ucla.edu/stat/examples/alda/teachers_pp.csv", sep=",", header=T) # whole data frame
 datos=ddply(teachers.pp,.(id),function(x) c(t=length(x$id), x=x[length(x$id),3])) #This is working fine.

Sekarang, saya telah membaca Strategi Split-Apply-Combine untuk Analisis Data dan itu diberikan contoh di mana mereka menggunakan sintaksis yang setara dengan yang saya masukkan di bawah:

  datos2=ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3]) #using summarise but the result is not what I want. 

Ini adalah bingkai data yang saya dapatkan menggunakan datos2

  id  t  x
  1   1  1
  2   2  0
  3   1  1
  4   1  1

Jadi, pertanyaan saya adalah: mengapa hasil ini berbeda dengan yang saya dapatkan menggunakan potongan kode pertama, maksud saya datos1? Apa yang saya lakukan salah?

Tidak jelas bagi saya kapan saya harus menggunakan summarise atau transform. Bisakah Anda memberi tahu saya sintaks yang benar untuk fungsi ddply?


person nhern121    schedule 25.07.2012    source sumber
comment
Menggunakan versi kedua Anda, kolom saya untuk t berbunyi: 1, 2, 1, 2. Salah ketik atau apakah itu sebenarnya yang dicetak mesin Anda?   -  person sebastian-c    schedule 26.07.2012
comment
Tidak, itu hasil yang dicetak oleh pc saya. 1,2,1,1. Terima kasih!   -  person nhern121    schedule 26.07.2012


Jawaban (1)


Saat Anda menggunakan summarise, berhenti mereferensikan bingkai data asli. Sebagai gantinya, tulis saja ekspresi dalam bentuk nama kolom.

Anda mencoba ini:

ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3])

padahal yang mungkin Anda inginkan adalah sesuatu yang lebih seperti ini:

ddply(teachers.pp,.(id), summarise, t=length(id), x=tail(event,1))
person joran    schedule 25.07.2012