我想获得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
...
有什么想法吗?
答案 0 :(得分:1)
一种方法是将corrr
package与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))
答案 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