Às vezes, preciso obter apenas a primeira linha de um conjunto de dados agrupada por um identificador, como ao recuperar idade e sexo, quando há várias observações por indivíduo. Qual é a maneira mais rápida (ou mais rápida) de fazer isso no R? Usei o agregate () abaixo e suspeito que existem maneiras melhores. Antes de postar essa pergunta, pesquisei um pouco no google, encontrei e tentei o ddply, e fiquei surpreso que era extremamente lento e me deu erros de memória no meu conjunto de dados (400.000 linhas x 16 cols, 7.000 IDs exclusivos), enquanto a versão agregada () foi razoavelmente rápido.
(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,])
ATUALIZAÇÃO: Veja a resposta de Chase e o comentário de Matt Parker sobre o que considero a abordagem mais elegante. Veja a resposta de @Matthew Dowle para a solução mais rápida que usa o data.table
pacote.
diff()
para que você possa escolher o primeiro ID dx
.