编写for循环以计数两个数据帧中的相似键

时间:2019-07-19 15:11:58

标签: r dataframe inner-join tidyverse

我有面板数据,其中我按年将整个数据集分成多个数据帧,并跨年匹配唯一键。例如,如果您在2000年有6,000个观测值,而在其中有7,000个观测值,则我想匹配2000年至2017年每年的每年重叠量。

我有一个蛮横的解决方案,它大约有350行复制和粘贴的代码,但是我正在寻找一个使用循环的更有效,更优雅的解决方案。

我正在使用for循环,目前正在研究map()函数,但尚未找到解决方案。我正在使用R4DS。

#1989
b1989 <- b %>% filter(year == 1989) %>% select(key, V7, z9, z11, z13, z15)
a1990 <- a %>% select(key,year) %>% filter(year == 1990) %>% distinct()
br1989 <- inner_join(b1989, a1990, by = "key")

#1990
b1990 <- b %>% filter(year == 1990) %>% select(key, V7, z9, z11, z13, z15)
a1991 <- a %>% select(key,year) %>% filter(year == 1991) %>% distinct()
br1990 <- inner_join(b1990, a1991, by = "key")

#1991
b1991 <- b %>% filter(year == 1991) %>% select(key, V7, z9, z11, z13, z15)
a1992 <- a %>% select(key,year) %>% filter(year == 1992) %>% distinct()
br1991 <- inner_join(b1991, a1992, by = "key")

busrescount_t1 <- c(nrow(br1989),nrow(br1990),nrow(br1991))

busrescount_t1
[1] 4366 4956 4768

它目前可以使用,但是代码很糟糕而且很麻烦。此外,在一场噩梦中大规模地进行2年,3年,4年的差异,将复制/粘贴代码超过1000行。

目标是要有一个循环,该循环产生可以被放置到数据帧中的这些匹配的向量。我正在尝试20多年。

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样? (我很希望能够使用您的数据样本来验证此功能。)

从理论上讲,我们应该能够将b加入到a的版本中,在该版本中,年份将向前移动一年。如果b中的行在a中具有相同的键并与下一年匹配,则联接应完成并且在TRUE列中具有a_match

b %>% 
  select(key, V7, z9, z11, z13, z15) %>%
  left_join(a %>% select(key, year) %>% 
               mutate(year = year + 1, a_match = TRUE),
            by = c("key", "year")) %>%
  filter(!is.na(a_match))