tidyverse-由其他列分组的多列之间的相关性

时间:2019-05-21 17:50:03

标签: r correlation tidyverse

我想获得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
...

有什么想法吗?

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:0)

一般来说:

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

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