2015-04-04 66 views
0

我有一個表有兩列(學生證和入學時間)比較日期和基準日期,並保留最接近

 ID    EnrollDate 
     1332   12/21/2005 
     2322   10/30/1995 
     1343   05/29/1990 

我有三列(學生證,日期1,和國)另一個表

 ID    Date1   State 
     1332   12/16/2005 MO 
     1332   12/12/2005 AL 
     2322   10/30/1995 AK 
     1343   02/01/1990 LO 
     1343   03/15/1990 LO 
     1343   03/05/1990 GA 

我試着根據這個邏輯創建第三個表。

  1. 檢查是否有表2
  2. 與重複ID意見如果發現有重複ID的觀察,然後用 EnrollDate檢查其日期1值,該ID。 例如:表2中的觀察1和2是重複的,因爲相同的ID(1332), 現在決定要消除哪個觀察,請檢查此Id的Date1 (12/16/2005 & 12/12/2005)與EnrollDate在表1中的相同Id(1332) (12/16/2005)。
  3. 對於該一對重複的,從表2只保留觀測其中日期1 最接近EnrollDate 即保留從表2的第一觀察結果,因爲2005年12月16日越接近 2005年12月21日。

    同樣僅第五觀測值從表2保留,第四和第六是 ,因爲丟棄該對觀察重複ID(1343),1990年3月15日 更接近1990年5月29日。

輸出應該看起來像這樣。

 ID    Date1   State 
     1332   12/16/2005 MO 
     2322   10/30/1995 AK 
     1343   03/15/1990 LO 

需要此邏輯的幫助。

+0

兩個多重複用ID的可能值?請按照您的想象構建一個具有儘可能多邊緣案例的示例。如何處理關係? – 2015-04-04 03:30:16

+0

@BondedDust,yup possible,在這種情況下沒有任何關係之間的Id和Date1 – 2015-04-04 04:06:47

回答

0

您可以嘗試

library(dplyr) 
left_join(df1, df2, by='ID') %>% 
      group_by(ID) %>% 
      mutate(diff= abs(as.Date(Date1, '%m/%d/%Y')- 
          as.Date(EnrollDate, '%m/%d/%Y'))) %>% 
      filter(diff==min(diff)) %>% 
      select(-EnrollDate, -diff) 
# ID  Date1 State 
#1 1332 12/16/2005 MO 
#2 2322 10/30/1995 AK 
#3 1343 03/15/1990 LO 
+0

由於某種原因%>%沒有工作,我改變了%%%,它工作完美,:) – 2015-04-05 00:43:28

+0

@KingFrazier我認爲你正在使用舊版本的'dplyr'。我使用'dplyr_0.4.1.9000' – akrun 2015-04-05 04:37:17