我有一个我订购的df:
df1 = df[with(df, order(ID, Admission)), ]
df1概述如下:
df1
ID Admission Op1
001122a 2010-01-25 GHJ12
001122a 2011-02-14 GHJ12
002233b 2011-01-27 GHJ12
002233b 2011-05-13 GHJ14
003344c 2010-06-01 GHJ12
003344c 2010-12-01 GHJ14
003344c 2011-03-27 GHJ12
有没有办法在这个场景中分组/提取行以获得每个特定$ ID的最早$ Admission,或者我是否必须使用循环?我想获得下面的df2:
df2
ID Admission Op1
001122a 2010-02-14 GHJ12
002233b 2011-01-27 GHJ12
003344c 2010-06-01 GHJ12
我意识到这可能是一个微不足道的问题,但我已经搜索过,找不到足够具体的东西来适用于这种情况。
非常感谢。
答案 0 :(得分:2)
以下是使用merge
和aggregate
> df1$Admission <- as.Date(df1$Admission, format="%Y-%m-%d")
> merge(aggregate(Admission ~ ID, max, data=df1), df1)
ID Admission Op1
1 001122a 2011-02-14 GHJ12
2 002233b 2011-05-13 GHJ14 # maybe your example has an error for this row.
3 003344c 2011-03-27 GHJ12
答案 1 :(得分:2)
由于您的数据集已订购,因此非常简单。只需删除包含重复值ID
:
df1[!duplicated(df1$ID), ]
# ID Admission Op1
# 1 001122a 2010-01-25 GHJ12
# 3 002233b 2011-01-27 GHJ12
# 5 003344c 2010-06-01 GHJ12
答案 2 :(得分:1)
使用ddply
中的plyr
:
ddply(df1,.(ID),function(x)x[which.max(as.Date(x$Admission)),])
ID Admission Op1
1 001122a 2011-02-14 GHJ12
2 002233b 2011-05-13 GHJ14
3 003344c 2011-03-27 GHJ12
或使用data.table
:
DT = data.table(df1,key='ID')
DT[,{
ii <- which.max(as.Date(Admission))
list(Admission= Admission[ii], Op1=Op1[ii]) },
by =ID]
ID Admission Op1
1: 001122a 2011-02-14 GHJ12
2: 002233b 2011-05-13 GHJ14
3: 003344c 2011-03-27 GHJ12