R中的两个数据框:如何逐行匹配多个行以查找另一个行值

时间:2017-12-01 04:18:07

标签: r dataframe dplyr nested-loops tidyverse

而不是像这样做一个嵌套的for循环:

    for (rowAll in 1:nrow(groupDataUnadjusted)) {
      year <- groupDataUnadjusted[rowAll, "year"]
      income  <- groupDataUnadjusted[rowAll, "income_group"]
      joint  <- groupDataUnadjusted[rowAll, "Joint"]
      child  <- groupDataUnadjusted[rowAll, "children"]

      for (rowPuf in 1:nrow(nationalPuf)) {
        yearPuf <- nationalPuf[rowPuf, "year"]
        incomePuf  <- nationalPuf[rowPuf, "income_group"]
        jointPuf  <- nationalPuf[rowPuf, "Joint"]
        childPuf  <- nationalPuf[rowPuf, "children"]

        if ((year == yearPuf) && (income == incomePuf) && (joint == jointPuf) && (child == childPuf)) {
          groupDataUnadjusted[rowAll, 'tax_difference_pct'] <- groupDataUnadjusted[rowAll, 'tax_difference_pct']   + nationalPuf[rowPuf, 'diff']
          break
        }
      }
    }
    groupDataAdjusted <- groupDataUnadjusted

我觉得必须有一种更快的方法来查找两个数据帧之间的相应行。我通过获取数据帧,不同长度以及查看三列相同的位置进行匹配。如果它们是相同的,我知道行是它们之间的匹配。然后我从该行中取一个值并将其添加到另一个数据帧中的值。

但是在R中必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

您可以使用dplyr

中的连接函数

取决于您是想要保留所有行还是仅保留匹配的行

library(dplyr)
groupDataAdjusted  <- left_join(groupDataUnadjusted, nationalPuf, by = c("year", "income_group","Joint","children") %>% 
                            mutate(tax_difference_pct = tax_difference_pct + diff)

请注意,这是未经测试的,因为您没有提供可重现的数据,但应该给您这个想法。

如果这些是唯一匹配的列名,则您不必指定&#34;按&#34;

或使用full_join保留所有行

请参阅本页第2页的右上角: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf