2015-04-04 79 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