添加(不合并!)两个具有不相等行和列的数据帧

Jef*_*ane 9 r dataframe

我想有效地对两个数据帧的条目求和,尽管不保证数据帧具有相同的维或列名.合并并不是我在这之后的真实情况.相反,我想创建一个输出对象,其中包含属于任一添加数据帧的所有行和列名称.在该输出的每个位置,我想对计算值使用以下逻辑:

  • 如果行/列配对属于两个输入数据帧,我希望输出包括它们的总和
  • 如果行/列配对仅属于一个输入数据帧,我想在输出中包含该值
  • 如果行/列配对不属于任何输入矩阵,我希望在输出中的该位置具有0.

例如,请考虑以下输入数据框:

df1 = data.frame(x = c(1,2,3), y = c(4,5,6))
rownames(df1) = c("a", "b", "c")
df2 = data.frame(x = c(7,8), z = c(9,10), w = c(2, 3))
rownames(df2) = c("a", "d")
> df1
  x y
a 1 4
b 2 5
c 3 6
> df2
  x  z  w 
a 7  9  2
d 8 10  3
Run Code Online (Sandbox Code Playgroud)

我想要最终结果

> df2
   x  y   z  w
a  8  4   9  2
b  2  5   0  0
c  3  6   0  0
d  8  0  10  3
Run Code Online (Sandbox Code Playgroud)

到目前为止我做了什么 -

dplyr中的bind_rows/bind_cols可以抛出以下内容:"错误:行数不兼容(3,期望2)"

我有重复的列名,所以'merge'也不能用于我的目的 - 由于某种原因返回一个空的df.

eip*_*i10 4

似乎您可以合并行名,然后通过一些额外的修改来处理总和并将其转换NA为零:

library(dplyr)

df.new = df1 %>% add_rownames %>%
  full_join(df2 %>% add_rownames, by="rowname") %>%
  mutate_each(funs(replace(., which(is.na(.)), 0))) %>%
  mutate(x = x.x + x.y) %>%
  select(rowname,x,y,z,w)
Run Code Online (Sandbox Code Playgroud)

或者,使用 @DavidArenburg 更优雅和可扩展的解决方案:

df.new = df1 %>% add_rownames %>% 
  full_join(df2 %>% add_rownames) %>% 
  group_by(rowname) %>% 
  summarise_each(funs(sum(., na.rm = TRUE)))

df.new

  rowname     x     y     z     w
1       a     8     4     9     2
2       b     2     5     0     0
3       c     3     6     0     0
4       d     8     0    10     3
Run Code Online (Sandbox Code Playgroud)