【问题标题】:Two dataframes in R: How to match multiple columns by row to find another row value [duplicate]R中的两个数据框:如何逐行匹配多列以找到另一个行值[重复]
【发布时间】:2018-05-15 03:45:51
【问题描述】:

而不是像这样进行嵌套的 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 中一定有更好的方法。

【问题讨论】:

  • 请提供示例数据。
  • @CCurtis 没必要。这是一般情况。
  • 实际上,这里有一个示例会有所帮助,因为除了加入之外,您还在两个数据帧中匹配的组上聚合 diff 变量。
  • @incodeverita 这正是我的观点。一个简单的问题不应该有一个抽象的例子,特别是如果这是你可以用谷歌搜索解决的问题。特别是在数据操作中,一个明显的例子就是一切。不要坐在这里认为这里投票的每个人都是错误的。

标签: r dataframe dplyr nested-loops tidyverse


【解决方案1】:

您可以使用 dplyr 的连接函数

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

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

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

如果这些是唯一匹配的列名,则不必指定“by”

或使用 full_join 保留所有行

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

【讨论】:

  • DF 的长度不同。
  • 长度不同没关系
  • 不同的长度在连接中应该无关紧要。如果这不能提供所需的输出,那么我需要示例数据来更好地解释您所需的输出
  • 你可能想要:groupDataAdjusted &lt;- left_join(groupDataUnadjusted, nationalPuf, by = c("year", "income_group","Joint","children") %&gt;% group_by(year, income_group, Joint, children) %&gt;% summarise(tax_difference_pct = tax_difference_pct[1] + sum(diff, na.rm = T)) %&gt;% ungroup。这假设分组变量在groupDataUnadjusted 中定义了唯一的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2016-12-30
  • 2013-07-27
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多