根据R中的多个条件从df中提取行

时间:2013-11-11 11:52:54

标签: r

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

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

非常感谢。

3 个答案:

答案 0 :(得分:2)

以下是使用mergeaggregate

的方法
> 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