【问题标题】:Aggregate rows in data.frame containing same values over different columns [duplicate]聚合data.frame中的行,在不同的列上包含相同的值[重复]
【发布时间】:2019-03-13 14:39:01
【问题描述】:

以下按预期工作:

m <- matrix (c(1, 2, 3,
               1, 2, 4,
               2, 1, 4,
               2, 1, 4,
               2, 3, 4,
               2, 3, 6,
               3, 2, 3,
               3, 2, 2), byrow=TRUE, ncol=3)

df <- data.frame(m)

aggdf <- aggregate(df$X3, list(df$X1, df$X2), FUN=sum)
colnames(aggdf) <- c("A", "B", "value")

结果:

  A B value
1 2 1     8
2 1 2     7
3 3 2     5
4 2 3    10

但我想将第 1/2 行和第 3/4 行视为平等,而不关心观察 A 为 1 且 B 为 2,反之亦然。

我也不关心聚合如何在最终的 data.frame 中对 A/B 进行排序,因此以下两个结果都可以:

  A  B  value
1 2  1    15
2 3  2    15


  A  B  value
1 1  2    15
2 2  3    15

如何实现?

【问题讨论】:

  • 尝试df[1:2] &lt;- t(apply(df[1:2], 1, sort)),然后进行聚合

标签: r dataframe aggregate


【解决方案1】:

您需要以一致的顺序获取它们。只需 2 列,pminpmax 就可以很好地工作:

df$A = with(df, pmin(X1, X2))
df$B = with(df, pmax(X1, X2))
aggregate(df$X3, df[c("A", "B")], FUN = sum)
#   A B  x
# 1 1 2 15
# 2 2 3 15

如需更多列,请使用 sort,正如 akrun 建议的那样:

df[1:2] <- t(apply(df[1:2], 1, sort))

通过将1:2 更改为所有关键列,这很容易概括。

【讨论】:

  • 你也可以加入df[1:2] &lt;- t(apply(df[1:2], 1, sort))
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 2017-06-02
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多