来自两个数据帧的总数据按行名匹配

Posted

技术标签:

【中文标题】来自两个数据帧的总数据按行名匹配【英文标题】:Sum data from two data frames matched by rowname 【发布时间】:2020-02-07 09:01:59 【问题描述】:

我有两个行数不同的数据框,因此:

df1:
           Data1
2019-03-01 0.011
2019-04-01 0.021
2019-05-01 0.013
2019-06-01 0.032
2019-07-01 NA

df2:
           Data2
2019-01-01 0.012
2019-02-01 0.024
2019-03-01 0.033
2019-04-01 0.017
2019-05-01 0.055
2019-06-01 0.032
2019-07-01 0.029

行名是日期。我想向 df1 添加第二列“结果”。此列将 df1$Data1 中的值与具有相同行名的 df2$Data2 行中的值相加。 (两个数据框中的行名都是唯一且有序的。)因此,例如:

df1$Result[1] <- df1$Data1[1] + df2$Data2[3]

结果是:

df1:
           Data1 Result
2019-03-01 0.011 0.044
2019-04-01 0.021 0.038
2019-05-01 0.013 0.068
2019-06-01 0.032 0.064
2019-07-01 NA    NA

我能弄清楚如何做到这一点的唯一方法是使用循环结构,但我必须认为有更好的方法。不过,我没有找到它,所以我想我正在寻找错误的东西。有什么想法吗?

我也愿意接受其他达到相同目的的建议。因此,例如,如果使用数据列中的日期而不是行名称中的日期更容易完成,那很好。或者如果使用 ts 对象会更容易,尽管我通常发现数据框更容易使用。

【问题讨论】:

您已经得到了有效的答案。但是,我建议您将这些日期用作日期列,而不是行名,因为这样可以更容易地在以后使用它们,以备不时之需 不过,有效的答案一次只能工作一行。有没有办法让它一次工作数千行,只使用行名(或日期列中的值)来匹配行? 我指的是@Ronak 的答案,它已经有效 啊!我的错。谢谢。 【参考方案1】:

我们可以使用data.table

library(data.table)
setDT(df1, keep.rownames = TRUE)
setDT(df2, keep.rownames = TRUE)
df2[df1, on = .(rn)][, sum := Data1 + Data2][]
#           rn Data2 Data1   sum
#1: 2019-03-01 0.033 0.011 0.044
#2: 2019-04-01 0.017 0.021 0.038
#3: 2019-05-01 0.055 0.013 0.068
#4: 2019-06-01 0.032 0.032 0.064
#5: 2019-07-01 0.029    NA    NA

【讨论】:

【参考方案2】:

您可以通过行名merge这两个数据框,然后添加相应的列

transform(merge(df1, df2, by = 0), sum = Data1 + Data2)


#   Row.names Data1 Data2   sum
#1 2019-03-01 0.011 0.033 0.044
#2 2019-04-01 0.021 0.017 0.038
#3 2019-05-01 0.013 0.055 0.068
#4 2019-06-01 0.032 0.032 0.064
#5 2019-07-01    NA 0.029    NA

或者与dplyr类似

library(dplyr)
library(tibble)

inner_join(df1 %>% rownames_to_column(), 
           df2 %>% rownames_to_column(), by = "rowname") %>%
mutate(Result = Data1 + Data2)

【讨论】:

谢谢!这两种解决方案都使用来自 df1 的数据、来自 df2 的数据和总和创建了第三个数据框。我想要做的是用总和向 df1 添加一个新列。但这似乎确实有效: df1$Result @Bolio 第三个数据框的行数已经与 df1 相同,对吧?您只需要选择相关的列。所以假设第三个数据框是df3,您可以通过df3[c(1, 2, 4)] 选择列,这相当于向df1 添加新列。此外,您使用的方法也应该没问题,并且应该给您预期的输出。 我发现了一个问题。在我上面的示例中,df1 包含 df2 中行的子集。在我的实际用例中, df1 和 df2 的长度不同,但只是部分重叠。这似乎打破了一切。上面添加的信息。 谢谢你,@Ronak。在写新问题的过程中,我找到了答案:合并的“all.x = TRUE”参数。

以上是关于来自两个数据帧的总数据按行名匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在不添加“Row.names”列的情况下按行名合并数据框?

根据来自不同数据帧的行名将列从另一个数据帧复制到

按行名合并 R 中超过 2 个数据框

Pandas - 匹配来自两个数据帧的两列并在 df1 中创建新列

R:从一个数据帧中提取行,基于列名匹配来自另一个数据帧的值

按行名过滤矩阵的嵌套列表