我有两个数据帧:
数据帧#1
A B C D E
2 1 0 5 7
和
Dataframe#2
C E F G
3 1 0 9
我想合并两个数据帧,使第一个数据帧作为参考,并将共同的列添加到一起
解决方案应如下所示:
A B C D E
2 1 3 5 8
请注意,共享列的元素(列C和E)已添加,Dataframe#2(列F和G)中的额外列被忽略,因为在Dataframe#1中找不到它们。每个Dataframe都有一行。
我尝试使用R中的本机函数以及合并包来完成此操作,但我没有运气。在我的应用程序中,我需要组合数千个列,其中许多列在两个数据帧之间共享,因此我正在开发一个强大的解决方案。
谢谢!
答案 0 :(得分:3)
这应该有效:
overlap = intersect(names(df1), names(df2))
df1[overlap] = df1[overlap] + df2[overlap]
假设数据帧中的行数在每个数据帧中相同。
答案 1 :(得分:1)
首先从宽格式转换为长格式,执行操作然后转换回来可能更容易。例如,使用dplyr
和tidyr
:
library(dplyr)
library(tidyr)
df1 <- data.frame(A = 2, B = 1, C = 0, D = 5, E = 7)
df2 <- data.frame(C = 3, E = 1, F = 0, G = 9)
df1 %>%
gather(variable, value) %>%
left_join(gather(df2, variable, value), by = "variable") %>%
rowwise() %>%
mutate(sum = sum(value.x, value.y, na.rm = TRUE)) %>%
select(variable, sum) %>%
spread(variable, sum)
这样做:将df1中的变量放入1列,将值放入另一列;对df2做同样的事情;使用df1作为参考,组合df1和df2;将每个变量的值相加;选择变量列和新值(总和);转换回宽格式。
结果:
# A tibble: 1 × 5
A B C D E
* <dbl> <dbl> <dbl> <dbl> <dbl>
1 2 1 3 5 8
通常,当您对许多列中的多个变量进行相同的度量时,值得考虑长格式是否更好地表示数据。