2013-11-11 4 views
2

У меня есть DF, который я заказал:Извлечение строк из ДФ на основе нескольких условий в R

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 

Есть ли способ, чтобы подмножество/извлечения строк в этом сценарии получить самый ранний $ Admission для каждого конкретного ID $, или мне придется использовать для этого циклы? Я хотел бы получить df2 ниже:

df2 

ID  Admission  Op1 
001122a 2010-02-14 GHJ12 
002233b 2011-01-27 GHJ12 
003344c 2010-06-01 GHJ12 

Я понимаю, что это может быть банальный вопрос, но я искал и ничего не могу найти достаточно конкретное, чтобы применить к этому сценарию.

Большое спасибо.

ответ

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 
+1

@ zx8754: вам просто нужно изменить 'max' на' min' в вызове функции. –

+0

Спасибо @agstudy, подход, использующий ddply, как представляется, отлично работает, заменяя which.max для which.min – user2870153

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 
+0

Спасибо за ответ @Jilber. Это не совсем то, что я хотел. Это все равно возвращает повторяющиеся идентификаторы. Однако я могу ошибаться. – user2870153

2

Поскольку ваш набор данных упорядочена, это v очень легко. Просто удалите строки, включая дублированные значения 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 
Смежные вопросы