บางครั้งฉันต้องรับเฉพาะแถวแรกของชุดข้อมูลที่จัดกลุ่มตามตัวระบุเช่นเดียวกับเมื่อดึงข้อมูลอายุและเพศเมื่อมีการสังเกตหลายครั้งต่อบุคคล อะไรคือวิธีที่รวดเร็ว (หรือเร็วที่สุด) ในการทำเช่นนี้ใน R? ฉันใช้การรวม () ด้านล่างและสงสัยว่ามีวิธีที่ดีกว่า ก่อนโพสต์คำถามนี้ฉันค้นหาบิตบน google พบและลองใช้ ddply และรู้สึกประหลาดใจที่มันช้ามากและทำให้ฉันมีข้อผิดพลาดของหน่วยความจำในชุดข้อมูลของฉัน (400,000 แถว x 16 cols, 7,000 ID ที่ไม่ซ้ำ) ในขณะที่รุ่นรวม เร็วพอสมควร
(dx <- data.frame(ID = factor(c(1,1,2,2,3,3)), AGE = c(30,30,40,40,35,35), FEM = factor(c(1,1,0,0,1,1))))
# ID AGE FEM
# 1 30 1
# 1 30 1
# 2 40 0
# 2 40 0
# 3 35 1
# 3 35 1
ag <- data.frame(ID=levels(dx$ID))
ag <- merge(ag, aggregate(AGE ~ ID, data=dx, function(x) x[1]), "ID")
ag <- merge(ag, aggregate(FEM ~ ID, data=dx, function(x) x[1]), "ID")
ag
# ID AGE FEM
# 1 30 1
# 2 40 0
# 3 35 1
#same result:
library(plyr)
ddply(.data = dx, .var = c("ID"), .fun = function(x) x[1,])
UPDATE:ดูคำตอบของ Chase และความคิดเห็นของ Matt Parker's สำหรับสิ่งที่ฉันคิดว่าเป็นวิธีการที่หรูหราที่สุด ดูคำตอบของ @Matthew Dowle สำหรับวิธีแก้ปัญหาที่เร็วที่สุดซึ่งใช้data.table
แพ็คเกจ
diff()
เพื่อให้คุณสามารถรับ ID แรกdx
ได้