r - 添加(不合并!)行和列不相等的两个数据框

标签 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
    

    我希望最终结果是
    > 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/

    相关文章:

    R:通过移动数据行按列扩展数据框

    regex - 如何获取R中两个字符第一次出现之间的模式?

    每行和每列都有条件的随机值(0 和 1)

    R - 绘制两个不同大小的向量

    r - 具有未知变量名称的管道 dplyr 突变

    python - pandas 中数据框的聚合函数

    r - 代码的并行版本需要更长的时间来运行

    python - 如何在 pandas groupby 中移动整个组

    python - 如何引用pandas dataframe的索引字段?

    python - 将两个 pandas DataFrame 与一个唯一的列组合起来,并保留行索引 (Python)