按第一行然后第二行连接R中的数据

时间:2018-09-17 12:39:32

标签: r join dplyr left-join vlookup

我有两个具有一个公共变量的数据集-ID(两个数据集中都有重复的ID号)。我需要将日期链接到一个数据集,但是我不能使用left-join,因为第一个或左边的文件必须保持原样(我不希望它返回所有组合并添加行)。但是我也不希望它链接Excel中的vlookup之类的数据,该数据查找第一个匹配项并返回它,因此当我有重复的ID号时,它仅返回第一个匹配项。我需要它返回第一个匹配项,然后返回第二个匹配项,然后返回第三个匹配项(因为对日期进行了排序,以便每个ID编号始终都是最新的日期),所以我不能添加行。有什么办法吗?由于我不知道该如何显示给您,因此我提供了一张我需要的示例图片。 data joining。不知道我是否说清楚了,但先谢谢您!

2 个答案:

答案 0 :(得分:0)

您可以添加第二列来创建遵循行号顺序的子ID。然后,您可以使用inner_join将所有内容连接在一起。

由于您没有示例数据集,因此我创建了两个以说明原理。

df1 <- df1 %>% 
  group_by(ID) %>% 
  mutate(follow_id = row_number())


df2 <- df2 %>% group_by(ID) %>% 
  mutate(follow_id = row_number())

outcome <- df1 %>% inner_join(df2)

# A tibble: 7 x 3
# Groups:   ID [?]
     ID sub_id var1 
  <dbl>  <int> <fct>
1     1      1 a    
2     1      2 b    
3     2      1 e    
4     3      1 f    
5     4      1 h    
6     4      2 i    
7     4      3 j    

数据:

df1 <- data.frame(ID = c(1, 1, 2,3,4,4,4))
df2 <- data.frame(ID = c(1,1,1,1,2,3,3,4,4,4,4),
                  var1 = letters[1:11])

答案 1 :(得分:0)

您需要一个辅助ID列。由于您需要前n个匹配项,因此请按ID分组,为每个组创建一个自动递增的ID,然后照常加入

df1<-data.frame(id=c(1,1,2,3,4,4,4))
d1=sample(seq(as.Date('1999/01/01'), as.Date('2012/01/01'), by="day"),11)
df2<-data.frame(id=c(1,1,1,1,2,3,3,4,4,4,4),d1,d2=d1+sample.int(50,11))
library(dplyr)
df11 <- df1 %>%
  group_by(id) %>%
  mutate(id2=1:n())%>%
  ungroup()
df21 <- df2 %>%
  group_by(id) %>%
  mutate(id2=1:n())%>%
  ungroup()

left_join(df11,df21,by = c("id", "id2"))

# A tibble: 7 x 4
     id   id2 d1         d2        
  <dbl> <int> <date>     <date>    
1     1     1 2009-06-10 2009-06-13
2     1     2 2004-05-28 2004-07-11
3     2     1 2001-08-13 2001-09-06
4     3     1 2005-12-30 2006-01-19
5     4     1 2000-08-06 2000-08-17
6     4     2 2010-09-02 2010-09-10
7     4     3 2007-07-27 2007-09-05