以下按预期工作:
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
如何实现?
答案 0 :(得分:1)
您需要以一致的顺序获取它们。对于仅两列,pmin
和pmax
可以很好地工作:
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
更改为所有关键列,可以很容易地泛化。