聚合data.frame中包含不同列上相同值的行

时间:2019-03-13 14:39:02

标签: r dataframe aggregate

以下按预期工作:

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

如何实现?

1 个答案:

答案 0 :(得分:1)

您需要以一致的顺序获取它们。对于仅两列,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

要获取更多列,请使用akrun建议的sort

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

通过将1:2更改为所有关键列,可以很容易地泛化。