我想有效地求和两个数据帧的条目,尽管不能保证数据帧具有相同的维数或列名。合并并不是我真正想要的。相反,我想创建一个输出对象,其中所有行和列的名称都属于所添加的数据帧中的任何一个。在该输出的每个位置,我想对计算值使用以下逻辑:
例如,请考虑以下输入数据帧:
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
我希望最终结果是
> 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
到目前为止,我已经做了-
dplyr中的bind_rows/bind_cols可以抛出以下内容:
“错误:行数不兼容(3,预期为2)”
我有重复的列名,所以“合并”也无法满足我的目的-由于某种原因返回了一个空df。
最佳答案
似乎您可以合并行名,然后注意总和,并将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)
或者,使用@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
关于r - 添加(不合并!)行和列不相等的两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35162993/