r - 如何使用 dplyr 从两组中成对计算列

标签 r dplyr purrr pairwise

我有一个这种形状的数据集。

group   a1   a2   ...   a9   b1   b2 ... b7
1       1    0    ...   1    0    1  ... 1
1       1    1    ...   1    0    0  ... 1
1       0    0    ...   0    1    0  ... 1
1       1    1    ...   0    1    1  ... 0
2       1    0    ...   1    0    1  ... 1
2       1    1    ...   1    0    0  ... 1
2       0    0    ...   0    1    0  ... 1
2       1    1    ...   0    1    1  ... 0
...

我想做的是将双参数汇总函数应用于所有列对,以保持数据的分组性质。

所以,例如

f = function(a, b) { mean(a) + mean(b) + mean(a & b) }

会返回类似的东西(我实际上并不打算计算函数的值,我只是输入“x”来指示统计数据的去向,但当然每个组a-b都会有所不同组合)。

group a_col  b_col  stat
1     a1     b1     x
1     a1     b2     x
1     a1     b3     x
...
1     a9     b7     x
2     a1     b1     x
...

评论者要求提供一些示例数据。这是:

structure(list(group = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 9L, 10L, 10L), a1 = c(0L, 
1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 
1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L), a2 = c(0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 
0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 
0L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L), a3 = c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 
1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 
0L, 0L), a4 = c(0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 
1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), a5 = c(1L, 0L, 0L, 0L, 0L, 
0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 
0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 0L
), b1 = c(1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 
0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 
0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L), b2 = c(0L, 0L, 1L, 0L, 0L, 0L, 
1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 
1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L), 
    b3 = c(0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 
    1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 
    1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-37L))

最佳答案

使用tidyverse的解决方案。我们可以根据两次起始字母聚集列,然后进行操作。假设您的数据名为 dat,则 dat2 是最终输出。

library(tidyverse)

dat2 <- dat %>%
  gather(column_a, value_a, starts_with("a")) %>%
  gather(column_b, value_b, starts_with("b")) %>%
  group_by(group, column_a, column_b) %>%
  summarise(stat = mean(value_a) + mean(value_b) + mean(value_a + value_b)) %>%
  ungroup()
dat2
# # A tibble: 150 x 4
#    group column_a column_b  stat
#    <int> <chr>    <chr>    <dbl>
#  1     1 a1       b1         3  
#  2     1 a1       b2         2  
#  3     1 a1       b3         2  
#  4     1 a2       b1         2  
#  5     1 a2       b2         1  
#  6     1 a2       b3         1  
#  7     1 a3       b1         3.5
#  8     1 a3       b2         2.5
#  9     1 a3       b3         2.5
# 10     1 a4       b1         2  
# # ... with 140 more rows

关于r - 如何使用 dplyr 从两组中成对计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51490079/

相关文章:

r - 对列执行分组以计算 R 中另一列的出现次数

r - 根据第二个输入更改第一个输入,使用 purrr 的 map2 应用函数

r - 如何根据条件进行累计计数?

r - 函数中的过滤参数默认使 dplyr::filter() 不过滤任何内容

R:在 DPLYR 中应用 3 步逻辑进行重复删除

r - 通过匹配日期合并2个数据框

r - 相当于 rowwise() do() 和 purrr,现在 by_row() 已被弃用?

dplyr 中带条件的递归函数

r - 删除 y 标签后子图错位

r - 其中(vector1 <vector2)