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