【问题标题】:Writing a for loop to count similar keys in two data frames编写一个 for 循环来计算两个数据帧中的相似键
【发布时间】: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/5963269stackoverflow.com/help/mcvestackoverflow.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


【解决方案1】:

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

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

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多