【发布时间】:2019-11-28 14:46:42
【问题描述】:
我有面板数据,我将整个数据集按年份拆分为多个数据框,并匹配不同年份的唯一键。例如,如果您在 2000 年有 6,000 个观测值,而在 7000 个观测值中,我试图匹配从 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 多年以来,我一直在努力做到这一点。
【问题讨论】:
-
Opyth43,欢迎来到 SO!如果不了解实际数据的一些东西(嗯,很多东西),就很难提供帮助。请通过包含示例明确数据(例如,编辑您的问题并添加
data.frame(x=...,y=...)或dput(head(x))的输出)和预期输出(基于样本输入)。参考:stackoverflow.com/questions/5963269、stackoverflow.com/help/mcve 和 stackoverflow.com/tags/r/info。 -
此外,如果您所有的逐年框架结构相同,而不是将它们分开,我建议您(1)将它们保持在一个框架中,使用
dplyr::group_by对其进行计算,或 (2) 至少将它们保存在list-of-frames 中,您可以通过使用lapply(list_of_frames, function(dfrm) ...)、stackoverflow.com/a/24376207/3358272 轻松对所有帧执行的操作。
标签: r dataframe inner-join tidyverse