连接两个具有两个ID协议的数据集,但R中缺少数据 [英] Join two data sets with two ID cols with missing data in R
本文介绍了连接两个具有两个ID协议的数据集,但R中缺少数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要加入R
中的两个data.frame
,它们都有两个ID候选者,但有很多丢失的数据(所以我不能只选择一个并过滤掉其余的)。
编辑两个数据集的可重现示例和所需结果:
messy1 <- data.frame(id1 = c(11, NA, 13, 11, 12, NA), id2 = c(NA, 22, 23, 21, NA, 23), time = rep(1:2, each = 3))
messy2 <- data.frame(id1 = c(12, NA, 14, 14), id2 = c(22, 23, 24, NA), time = c(1, 1, 1, 2))
desired1 <- data.frame(id1 = rep(11:13, 2), id2 = rep(21:23, 2), time = rep(1:2, each = 3)) # 12/22 is only available in messy2
desired2 <- data.frame(id1 = c(12:13, 14, 14), id2 = c(22:23, 24, 24), time = c(rep(1, 3), 2)) # 13/23 is only available in messy1
desired_joined <- full_join(desired1, desired2)
> messy1
id1 id2 time
1 11 NA 1
2 NA 22 1
3 13 23 1
4 11 21 2
5 12 NA 2
6 NA 23 2
> messy2
id1 id2 time
1 12 22 1
2 NA 23 1
3 14 24 1
4 14 NA 2
> desired_joined
id1 id2 time
1 11 21 1
2 12 22 1
3 13 23 1
4 11 21 2
5 12 22 2
6 13 23 2
7 14 24 1
8 14 24 2
最终编辑
上面的例子现在准确地反映了我试图解决的问题。弄清楚这一点后,@Ben提供的评论就是实际的解决方案。
已删除问题的过时部分,以避免将来遇到此问题的任何人进一步感到困惑。
推荐答案
正如我在对该问题的最新编辑中指出的,解决方案是执行fill()
。我在实际的RWD中发现,在连接之前,最好在每个数据集中使用id1
和id2
进行双填充。任何需要执行类似操作的人都可以使用以下步骤:
fill1 <- messy1 %>%
group_by(id1) %>% fill(id2, .direction = "downup") %>%
group_by(id2) %>% fill(id1, .direction = "downup") %>%
ungroup()
fill2 <- messy2 %>%
group_by(id1) %>% fill(id2, .direction = "downup") %>%
group_by(id2) %>% fill(id1, .direction = "downup") %>%
ungroup()
full_join(messy1, messy2) %>%
group_by(id1) %>% fill(id2, .direction = "downup") %>%
group_by(id2) %>% fill(id1, .direction = "downup") %>%
ungroup() %>%
distinct()
Joining, by = c("id1", "id2", "time")
# A tibble: 8 x 3
# Groups: id2 [4]
id1 id2 time
<dbl> <dbl> <dbl>
1 11 21 1
2 12 22 1
3 13 23 1
4 11 21 2
5 12 22 2
6 13 23 2
7 14 24 1
8 14 24 2
注意:我的实际数据集每个有大约65k行,但是如果我在fill
之前join
,我最终得到2.5M行(原因我不清楚)。通过执行所有这些fill
操作,我最终得到了更合理的73k行。
这篇关于连接两个具有两个ID协议的数据集,但R中缺少数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文