从 long-formated tibble 比较变量对及其逆等价物并选择更高的值

From long-formated tibble compare variable pairs with its inverse equivalent and pick higher value

我正在处理由转换为长格式的矩阵组成的小标题。矩阵只是一个函数的 all-vs-all 值输出。然而,函数的输出根据提供的值的顺序而不同,即 function(x,y) != function(y,x)。因此,我试图改变 tibble,以便附加列将包含两者中较高的结果:function(x,y) 或 function(y,x)。我正在为此苦苦挣扎,但我很确定有一个我看不到的优雅解决方案。

df1 <- tibble(n1 = rep(c('a', 'b', 'c'), each=3), n2 = rep(c('a', 'b', 'c'),3), val = sample(1:100,9))

df1
n1 n2 v1 
a   a    41
a   b    94
a   c    40
b   a    85
b   b    82
b   c    35
c   a    66
c   b    70
c   c    76

因此 mutate 的结果将如下所示:

n1 n2 v1 v1.high
a   a    41 41
a   b    94 94
a   c    40 66
b   a    85 94
b   b    82 82
b   c    35 70
c   a    66 66
c   b    70 70
c   c    76 76

使用 dplyr 的一个选项可能是:

df1 %>%
    group_by(grp = paste(pmax(n1, n2), pmin(n1, n2))) %>%
    mutate(val_high = max(val)) %>%
    ungroup() %>%
    select(-grp)

  n1    n2      val val_high
  <chr> <chr> <int>    <int>
1 a     a        38       38
2 a     b        37       75
3 a     c        34       34
4 b     a        75       75
5 b     b        91       91
6 b     c        54       54
7 c     a         3       34
8 c     b        16       54
9 c     c        46       46

基数 R:

使用apply:

df1$v1.high <- apply(df1, 1, function(x) max(df1[(df1$n1 == x[2]) & (df1$n2 == x[1]), 3]))