我想将数据帧聚合两列,以便它们的变化只存在一次.值列应由聚合函数聚合,如max()或sum() 数据: itemID1 |itemID2 |value---------|---------|-------B0001 |B0001 |1B0002 |B0001 |1B0001 |B0002 |2B0002 |B0002 |0 结果
数据:
itemID1 |itemID2 |value ---------|---------|------- B0001 |B0001 |1 B0002 |B0001 |1 B0001 |B0002 |2 B0002 |B0002 |0
结果可能是:
itemID1 |itemID2 |value ----------|----------|--------- B0001 |B0001 |1 B0001 |B0002 |3 #itemIDs could also be ordered in the other way B0002 |B0002 |0
到目前为止,我已经在SQL中实现它以通过库sqldf使用它,但是sqldf不支持WITH子句.
是否有可能直接在R中聚合这样的数据帧?
使用dplyr和pmin / pmax:library(dplyr)
df1 %>%
mutate(ItemID1_ = pmin(itemID1 ,itemID2),
ItemID2_ = pmax(itemID1 ,itemID2)) %>%
group_by(ItemID1_,ItemID2_) %>%
summarize_at("value",sum) %>%
ungroup
# # A tibble: 3 x 3
# ItemID1_ ItemID2_ value
# <chr> <chr> <int>
# 1 B0001 B0001 1
# 2 B0001 B0002 3
# 3 B0002 B0002 0
关注@ A5C1D2H2I1M1N2O1R2T1的评论后,您可以跳过mutate部分并使用相同的输出:
df1 %>%
group_by(itemID1_ = pmin(itemID1, itemID2),
itemID2_ = pmax(itemID1, itemID2)) %>%
summarise_at("value", sum) %>%
ungroup
