从 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]))
我正在处理由转换为长格式的矩阵组成的小标题。矩阵只是一个函数的 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]))