如何在R

时间:2017-03-19 23:26:45

标签: r merge match

我有两个数据帧:

数据帧#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中的本机函数以及合并包来完成此操作,但我没有运气。在我的应用程序中,我需要组合数千个列,其中许多列在两个数据帧之间共享,因此我正在开发一个强大的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:3)

这应该有效:

overlap = intersect(names(df1), names(df2))
df1[overlap] = df1[overlap] + df2[overlap]

假设数据帧中​​的行数在每个数据帧中相同。

答案 1 :(得分:1)

首先从宽格式转换为长格式,执行操作然后转换回来可能更容易。例如,使用dplyrtidyr

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

通常,当您对许多列中的多个变量进行相同的度量时,值得考虑长格式是否更好地表示数据。