【问题标题】:tidyverse - Correlations among multiple columns grouped by other columntidyverse - 由其他列分组的多列之间的相关性
【发布时间】:2019-05-21 17:50:02
【问题描述】:

我想在 tidyverse 中获得跨多个变量的相关矩阵。但是,我想按另一列分组。例如。假设我有一个数据框 df 和列 year,我想查看 V1V2V3 之间的相关性。

year    V1    V2    V3    misc_var
2018    5     6     5     a
2018    4     6     4     b
2018    3     2     3     NA
2013    5     8     2     4
2013    6     3     8     8
2013    4     7     5     NA

我试过了。沿着

cor_output = df %>%
  group_by(year) %>%
  select(V1, V2, V3, year) %>%
  cor(use = "pairwise.complete.obs")

但是,它不是计算每年从 V1 到 V3 的相关性,而是将year 变量添加到相关性中。

所需的输出应该是这样的(请注意输出中的相关性是组成的)

year    var    V1    V2    V3
2013    V1     1    0.7    0.3
2013    V2     ...    1    ...
...
...
2018    V2    0.6    1    0.7
...

有什么想法吗?

【问题讨论】:

    标签: r correlation tidyverse


    【解决方案1】:

    一种方法是将corrr packagepurrr::nest() 结合使用:

    library(tidyverse)
    library(corrr)
    
    df <- tribble(
        ~year, ~V1, ~V2, ~V3, ~misc_var,
         2018,   5,   6,   5,       "a",
         2018,   4,   6,   4,       "b",
         2018,   3,   2,   3,        NA,
         2013,   5,   8,   2,       "4",
         2013,   6,   3,   8,       "8",
         2013,   4,   7,   5,        NA
        )
    
    df %>%
      select_if(is.numeric) %>%
      group_by(year) %>%
      nest() %>%
      mutate(
        correlations = map(data, correlate)
      ) %>%
      unnest(correlations)
    #> 
    #> Correlation method: 'pearson'
    #> Missing treated using: 'pairwise.complete.obs'
    #> 
    #> 
    #> Correlation method: 'pearson'
    #> Missing treated using: 'pairwise.complete.obs'
    #> # A tibble: 6 x 5
    #>    year rowname     V1     V2     V3
    #>   <dbl> <chr>    <dbl>  <dbl>  <dbl>
    #> 1  2018 V1      NA      0.866  1    
    #> 2  2018 V2       0.866 NA      0.866
    #> 3  2018 V3       1      0.866 NA    
    #> 4  2013 V1      NA     -0.756  0.5  
    #> 5  2013 V2      -0.756 NA     -0.945
    #> 6  2013 V3       0.5   -0.945 NA
    

    或者,您可以使用dplyr 中更具实验性的group_mapgroup_modify 函数:

    df %>%
      select_if(is.numeric) %>%
      group_by(year) %>%
      group_map(~ correlate(.x))      # or group_modify(~ correlate(.x))
    

    【讨论】:

    • 不错。谢谢你的帮助。我使用 group_map 函数直接尝试了您的替代解决方案,效果很好。
    【解决方案2】:

    一般来说:

    dataframe %>%
      select(grouping_variable, columns) %>%
      group_by(grouping_variable) %>%
      group_modify(~ corrr::correlate(.x))
    

    其中columns 可能是c(col_1, col_2, ...)col_1:col_10

    【讨论】:

      猜你喜欢
      • 2020-05-24
      • 2020-10-13
      • 2017-01-11
      • 2022-09-23
      • 2021-11-12
      • 2014-02-09
      • 2018-07-01
      • 2021-01-16
      • 2019-11-03
      相关资源
      最近更新 更多