tidyverse - корреляции между несколькими столбцами, сгруппированными по другому столбцу. - PullRequest
1 голос
/ 21 мая 2019

Я хочу получить корреляционную матрицу для нескольких переменных в Tidyverse. Тем не менее, я хочу сделать это сгруппированы по другому столбцу. Например. Предположим, у меня есть фрейм данных df со столбцами year, и я хочу увидеть корреляции по V1, V2, V3 по годам.

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
...

Есть мысли?

1 Ответ

1 голос
/ 21 мая 2019

Один из подходов заключается в использовании пакета corrr в сочетании с purrr::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_modify из dplyr:

df %>%
  select_if(is.numeric) %>%
  group_by(year) %>%
  group_map(~ correlate(.x))      # or group_modify(~ correlate(.x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...