2

我有一个我订购的 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

我意识到这可能是一个微不足道的问题,但我已经搜索过并且找不到任何足够具体的东西来适用于这种情况。

非常感谢。

4

3 回答 3

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
于 2013-11-11T12:03:33.473 回答
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
于 2013-11-11T15:13:50.703 回答
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
于 2013-11-11T12:29:34.277 回答