Czasami muszę uzyskać tylko pierwszy wiersz zestawu danych pogrupowany według identyfikatora, tak jak przy pobieraniu wieku i płci, gdy na osobę przypada wiele obserwacji. Jaki jest szybki (lub najszybszy) sposób, aby to zrobić w R? Użyłem agregacji () poniżej i podejrzewam, że są lepsze sposoby. Przed opublikowaniem tego pytania przeszukałem trochę w google, znalazłem i wypróbowałem ddply i zdziwiłem się, że jest on bardzo wolny i dał mi błędy pamięci w moim zestawie danych (400 000 wierszy x 16 kols, 7 000 unikalnych identyfikatorów), podczas gdy wersja agregująca () był dość szybki.
(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,])
AKTUALIZACJA: Zobacz odpowiedź Chase'a i komentarz Matta Parkera, co uważam za najbardziej eleganckie podejście. Zobacz odpowiedź @Matthew Dowle na najszybsze rozwiązanie korzystające z data.table
pakietu.
diff()
, abyś mógł odebrać pierwszy identyfikator w dx
.