ข้อสงสัยเกี่ยวกับฟังก์ชัน ddply ใน R

ฉันกำลังพยายามสรุป group by ที่เทียบเท่าใน R ผ่านฟังก์ชัน plyr ชื่อ ddply ฉันมีกรอบข้อมูลที่มีสามคอลัมน์ (พูด id, period และ event) จากนั้น ฉันต้องการนับเวลาที่แต่ละ id ปรากฏในกรอบข้อมูล (count(*)... group by id พร้อมด้วย SQL) และรับองค์ประกอบสุดท้ายของแต่ละ id ที่สอดคล้องกับคอลัมน์ event

นี่คือตัวอย่างของสิ่งที่ฉันมีและสิ่งที่ฉันพยายามที่จะได้รับ:

  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

นี่คือรหัสง่าย ๆ ที่ฉันใช้สำหรับสิ่งนั้น:

 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.

ตอนนี้ ฉันได้อ่าน The Split-Apply-Combine Strategy for Data Analysis แล้ว ได้รับตัวอย่างที่พวกเขาใช้ไวยากรณ์ที่เทียบเท่ากับที่ฉันใส่ไว้ด้านล่าง:

  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. 

นี่คือกรอบข้อมูลที่ฉันใช้ datos2

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

ดังนั้น คำถามของฉันคือ: เหตุใดผลลัพธ์นี้จึงแตกต่างจากผลลัพธ์ที่ฉันใช้โค้ดชิ้นแรก ฉันหมายถึง datos1 ผมทำอะไรผิดหรือเปล่า?

ไม่ชัดเจนสำหรับฉันเมื่อฉันต้องใช้ summarise หรือ transform คุณช่วยบอกไวยากรณ์ที่ถูกต้องสำหรับฟังก์ชัน ddply ให้ฉันหน่อยได้ไหม


person nhern121    schedule 25.07.2012    source แหล่งที่มา
comment
เมื่อใช้เวอร์ชันที่สองของคุณ คอลัมน์ของฉันสำหรับ t อ่านได้: 1, 2, 1, 2 พิมพ์ผิดหรือนั่นคือสิ่งที่เครื่องของคุณพิมพ์ออกมาจริงๆ?   -  person sebastian-c    schedule 26.07.2012
comment
ไม่ นั่นคือผลลัพธ์ที่พีซีของฉันกำลังพิมพ์ออกมา 1,2,1,1. ขอบคุณ!   -  person nhern121    schedule 26.07.2012


คำตอบ (1)


เมื่อคุณใช้ summarise ให้หยุดการอ้างอิงเฟรมข้อมูลดั้งเดิม ให้เขียนนิพจน์ในรูปของชื่อคอลัมน์แทน

คุณลองสิ่งนี้:

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

เมื่อสิ่งที่คุณต้องการคือสิ่งที่มากกว่านี้:

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