【问题标题】:R: Add two data frames with same dimensionsR:添加两个相同维度的数据框
【发布时间】:2015-05-28 20:03:41
【问题描述】:

我有 df1:

Type     CA     AR     Total
alpha    2      3        5
beta     1      5        6
gamma    6      2        8
delta    8      1        9

我有 df2:

Type     CA     AR     Total
alpha    3      4        7
beta     2      6        8
gamma    9      1        10
delta    4      1        5

我想将两个数据帧中的值相加以获得 1 个具有此结果的数据帧:

    Type     CA     AR     Total
    alpha    5      7        12
    beta     3      11       14
    gamma    15     3        18
    delta    12     2        14

示例 --> (alpha, CA) = 2(来自 df1)+ 3(来自 df2)= 5(结果 df)

有人知道怎么做吗?我认为这并不完全是合并,因为合并会覆盖该值,而我想添加该值。

提前致谢!!

【问题讨论】:

标签: r


【解决方案1】:

+是向量化的,这只是R中的一个简单操作

cbind(df1[1], df1[-1] + df2[-1])
#    Type CA AR Total
# 1 alpha  5  7    12
# 2  beta  3 11    14
# 3 gamma 15  3    18
# 4 delta 12  2    14

如果您的数据集没有正确排序,您可以使用match(如 cmets 中所述)

cbind(df1[1], df1[, -1] + df2[match(df1$Type, df2$Type), -1])

【讨论】:

  • @user4918087 只是一个警告。既然你提到了合并这个词,如果你的行顺序不一样,你可能需要一个不同的答案match
  • @Vlo 如果没有订购,我会做df1[order(df1[, 1]), -1] + df2[order(df2[, 1]), -1]
  • 那行得通。在想df2[match(df[,1], df[,2]), -1] + df[,-1]
  • @Vlo 我认为您的意思是df1[, -1] + df2[match(df1$Type, df2$Type), -1],因为您需要匹配正确的列。虽然我只是在编辑这个。
  • 是的,我本来是想写match(df1[,1], df2[,1]),但按名称引用更好
【解决方案2】:

您可以将它们相加并重新添加因子列。

df_tot <- df1 + df2
df_tot$Type = df1$Type

【讨论】:

  • 这是不正确的,因为还有一个字符/因子列
  • 没错,这就是第二行重新定义它的原因。
  • @Frank 即使它是一个因素,它也会给出一个带有警告的 NA 列。 (Warning message: In Ops.factor(left, right) : ‘+’ not meaningful for factors)。很容易将该因子列从计算中分离出来,而不是发出警告,然后重新分配一个列。
  • @akrun 我想我只是对额外的括号/括号的混乱和收到警告无动于衷。真正的解决方案(至少对于本示例而言)是将数值数据存储在矩阵中,在这种情况下,可信赖的 vanilla + 确实有效。
  • @Frank 是的,我尊重你的立场。我注意到在某些情况下,一些以前的海报甚至抱怨一些友好的警告。 matrices 会更快更自然..
【解决方案3】:

如果你想走那条路,你可以使用dplyr + magrittr

library("dplyr")
library("magrittr")

df1 %>% select(-type) %>%
    add(df2 %>% select(-type)) %>%
    mutate(type = df1$type)

注意:这假设df1df2 以相同的方式排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2018-10-11
    • 2017-07-26
    • 1970-01-01
    • 2021-07-28
    • 2021-03-29
    • 2020-10-27
    相关资源
    最近更新 更多