Іноді мені потрібно отримати лише перший рядок набору даних, згрупований за ідентифікатором, як при пошуку віку та статі, коли на кожного людини є кілька спостережень. Який швидкий (або найшвидший) спосіб зробити це в R? Я використовував агрегат () нижче і підозрюю, що є кращі способи. Перш ніж надсилати це питання, я трохи шукав у google, знайшов і спробував ddply, і був здивований, що це надзвичайно повільно, і дав мені помилки пам'яті на моєму наборі даних (400 000 рядків x 16 cols, 7000 унікальних ідентифікаторів), тоді як сукупна () версія був досить швидким.
(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
.