有时,我只需要按标识符将数据集的第一行获取,例如当每个人有多个观察值时检索年龄和性别时。在R中最快(或最快)的方法是什么?我在下面使用了aggregate(),并怀疑还有更好的方法。在发布此问题之前,我在Google上进行了一些搜索,发现并尝试了ddply,但感到惊讶的是它运行速度极慢,并给我数据集上的内存错误(400,000行x 16列,7,000个唯一ID),而aggregate()版本相当快。
(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,])
更新:请参阅Chase的回答和Matt Parker的评论,以获取我认为是最优雅的方法。有关使用该data.table
软件包的最快解决方案,请参见@Matthew Dowle的答案。
diff()
以便您可以在中提取第一个ID dx
。