Иногда мне нужно получить только первую строку набора данных, сгруппированную по идентификатору, как при получении возраста и пола, когда существует несколько наблюдений на человека. Какой быстрый (или самый быстрый) способ сделать это в R? Я использовал агрегат () ниже и подозреваю, что есть лучшие способы. Перед публикацией этого вопроса я немного искал в Google, нашел и попробовал ddply, и был удивлен, что он был очень медленным и дал мне ошибки памяти в моем наборе данных (400 000 строк x 16 столбцов, 7 000 уникальных идентификаторов), тогда как версия 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,])
ОБНОВЛЕНИЕ: См. Ответ Чейза и комментарий Мэтта Паркера о том, что я считаю самым элегантным подходом. Посмотрите ответ @Matthew Dowle для быстрого решения, которое использует data.table
пакет.
diff()
чтобы вы могли получить первый идентификатор dx
.