如何汇总只有排列不同的多行

时间:2019-05-25 06:14:03

标签: r

如何汇总只有排列不同的多行?

说。像这样在data.frame中存储数据:

V1, V2
1, 2
3, 2
2, 1
5, 1
7, 8
1, 9
5, 1

1, 22, 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, 22, 1

没有找到符合我预期结果的解决方案。有参考和建议吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用dplyrpurrr的一种可能性是:

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)