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