代码之家  ›  专栏  ›  技术社区  ›  rcorty

如何使用dpylr从两组中计算列对

  •  0
  • rcorty  · 技术社区  · 6 年前

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

    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”来指示stat的位置,但是对于每个组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))
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   www    6 年前

    使用的解决方案 tidyverse . 我们可以 gather 以两个起始字母为基础的列,然后进行操作。假设您的数据被调用 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