dplyr :: group_by两列相同的变量,顺序无关紧要

ore*_*ano 1 r dplyr

我想根据两列中的值汇总一个数据框,除了每列实际上都有相同的变量,我不关心顺序是什么.这是一个示例数据框:

> df<-data.frame(val1=c(1,1,1,2,2), val2=c(1,2,2,1,1), val3=c(10, 20, 30, 40, 50))
> df
  val1 val2 val3
1    1    1   10
2    1    2   20
3    1    2   30
4    2    1   40
5    2    1   50
Run Code Online (Sandbox Code Playgroud)

我感兴趣的总结了val3,除了我只关心无序的组合val1val2.所以我想要对待

  val1 val2 val3
1    1    2   20
Run Code Online (Sandbox Code Playgroud)

同样的

  val1 val2 val3
1    2    1   40
Run Code Online (Sandbox Code Playgroud)

我可以使用dplyr按列分组并总结如下:

> df %>% group_by(val1, val2) %>% summarize(mean=mean(val3))
Source: local data frame [3 x 3]
Groups: val1 [?]

   val1  val2  mean
  <dbl> <dbl> <dbl>
1     1     1    10
2     1     2    25
3     2     1    45
Run Code Online (Sandbox Code Playgroud)

但我希望这个结果只包含两行!

我想过创建一个反映组合的新变量val1,并val2通过再组,但不能找出一个简单的方法来此.val1并且val2不必是数字,并且可能不会总是连续的整数.

akr*_*run 6

我们可以使用pminpmax创建分组变量

df %>%
    group_by(val_1 = pmin(val1, val2), val_2 = pmax(val1, val2)) %>% 
    summarise(val3 = mean(val3))
#   val_1 val_2  val3
#  <dbl> <dbl> <dbl>
#1     1     1    10
#2     1     2    35
Run Code Online (Sandbox Code Playgroud)

正如@Gregor在评论中提到的,更改名称的使用是有意的(val_1相对于val1val_2代替val2),因为pmax如果我们有第二个语句将评估'val1'列的输出val1= pmin(val1, val2)