如何汇总只有排列不同的多行?
说。像这样在data.frame中存储数据:
V1, V2
1, 2
3, 2
2, 1
5, 1
7, 8
1, 9
5, 1
1, 2
和2, 1
应视为同一行。因此有两个1, 2
。
预期结果应为:
V1, V2, V3
1, 2, 2
3, 2, 1
5, 1, 2
7, 8, 1
1, 9, 1
许多解决方案我只搜索基于另一列的汇总列。
因此,这些解决方案可以将5, 1
汇总为5, 2
。
并且unique
也不能聚合1, 2
和2, 1
。
没有找到符合我预期结果的解决方案。有参考和建议吗?
谢谢。
答案 0 :(得分:1)
使用dplyr
和purrr
的一种可能性是:
df %>%
group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
add_count(grp, name = "V3") %>%
slice(1) %>%
ungroup() %>%
select(-grp)
V1 V2 V3
<int> <int> <int>
1 1 2 2
2 3 2 1
3 5 1 2
4 7 8 1
5 1 9 1
或仅使用dplyr
:
df %>%
group_by(grp = paste(pmax(V1, V2), pmin(V1, V2), sep = "_")) %>%
add_count(grp, name = "V3") %>%
slice(1) %>%
ungroup() %>%
select(-grp)
或者:
df %>%
rowwise() %>%
mutate(grp = paste(sort(c(V1, V2)), collapse = "_")) %>%
group_by(grp) %>%
add_count(grp, name = "V3") %>%
slice(1) %>%
ungroup() %>%
select(-grp)
对base R
使用相同的逻辑:
df$grp <- with(df, paste(pmax(V1, V2), pmin(V1, V2), sep = "_"))
df$V3 <- with(df, ave(grp, grp, FUN = length))
df <- df[!duplicated(df$grp), ][, -3]
答案 1 :(得分:0)
使用base R
aggregate(cbind(V3 = rep(1, nrow(df1)))~., data = t(apply(df1, 1, sort)), sum)