在第一行中连接R中的数据,然后是第二行,依此类推

问题描述 投票:0回答:2

我有两个带有一个公共变量的数据集 - ID(两个数据集中都有重复的ID号)。我需要将日期链接到一个数据集,但我不能使用left-join,因为第一个或左侧文件所以需要保持原样(我不希望它返回所有组合并添加行)。但我也不希望它链接像Excel中的vlookup这样的数据,它找到第一个匹配并返回它,所以当我有重复的ID号时,它只返回第一个匹配。我需要它返回第一个匹配,然后是第二个匹配,然后是第三个匹配(因为日期被排序,以便最新的日期始终是每个ID号的第一个),依此类推,但我不能添加行。有没有办法做到这一点?由于我不知道如何向您展示我已经包含了我需要的示例图片。 data joining。我不确定自己是否清楚但是提前谢谢你!

r join dplyr left-join vlookup
2个回答
0
投票

您可以添加第二列来创建遵循rownumbers顺序的子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])

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
© www.soinside.com 2019 - 2024. All rights reserved.