使用purrr和嵌套data.frame计算批量成对相关性
我想计算mtcars数据集中每个cyl的“mpg”和所有其他感兴趣的数值变量之间的成对相关性。我想采用整洁数据原则 使用使用purrr和嵌套data.frame计算批量成对相关性,r,dplyr,correlation,tidyr,purrr,R,Dplyr,Correlation,Tidyr,Purrr,我想计算mtcars数据集中每个cyl的“mpg”和所有其他感兴趣的数值变量之间的成对相关性。我想采用整洁数据原则 使用corrr::correlate()非常简单 这对你有用吗?我在过去做过这项工作,但只在较小的数据集上进行,并且没有对其进行基准测试,因此对性能没有把握。我使用pivot\u longer在嵌套之前重塑数据。您传递的变量基本上是作为过滤步骤工作的 mtcars2 <- mtcars[,1:7] %>% pivot_longer(c(-mpg, -cyl), na
corrr::correlate()
非常简单
这对你有用吗?我在过去做过这项工作,但只在较小的数据集上进行,并且没有对其进行基准测试,因此对性能没有把握。我使用
pivot\u longer
在嵌套之前重塑数据。您传递的变量基本上是作为过滤步骤工作的
mtcars2 <- mtcars[,1:7] %>%
pivot_longer(c(-mpg, -cyl), names_to = "y.var", values_to = "value" ) %>%
group_nest(cyl, y.var) %>%
mutate(x.var = "mpg", #just so you can see this in the output
cor = map_dbl(data, ~ {cor <- cor.test(.x$mpg, .x$value)
cor$estimate})) %>%
select(data, cyl, x.var , y.var, cor) %>%
arrange(cyl, y.var)
mtcars2%
轴长(c(-mpg,-cyl),名称为“\u to=“y.var”,值为“\u to=“value”)%>%
组嵌套(循环,y.var)%>%
mutate(x.var=“mpg”),以便您可以在输出中看到这一点
cor=map\u dbl(数据,{cor%
选择(数据、气缸、x.var、y.var、cor)%>%
排列(循环,y.var)
这对您有用吗?我以前做过,但只在较小的数据集上做过,没有对其进行基准测试,因此无法确定性能。我使用pivot\u long
在嵌套之前对数据进行重塑。传递的变量基本上是作为过滤步骤,某种程度上
mtcars2 <- mtcars[,1:7] %>%
pivot_longer(c(-mpg, -cyl), names_to = "y.var", values_to = "value" ) %>%
group_nest(cyl, y.var) %>%
mutate(x.var = "mpg", #just so you can see this in the output
cor = map_dbl(data, ~ {cor <- cor.test(.x$mpg, .x$value)
cor$estimate})) %>%
select(data, cyl, x.var , y.var, cor) %>%
arrange(cyl, y.var)
mtcars2%
轴长(c(-mpg,-cyl),名称为“\u to=“y.var”,值为“\u to=“value”)%>%
组嵌套(循环,y.var)%>%
mutate(x.var=“mpg”),以便您可以在输出中看到这一点
cor=map\u dbl(数据,{cor%
选择(数据、气缸、x.var、y.var、cor)%>%
排列(循环,y.var)
如果您需要使用cor.test,下面是使用扫帚的选项:
library(broom)
library(tidyr)
library(dplyr)
mtcars[,1:7] %>%
pivot_longer(-c(mpg,cyl)) %>%
group_by(cyl,name) %>%
do(tidy(cor.test(.$mpg,.$value)))
# A tibble: 15 x 10
# Groups: cyl, name [15]
cyl name estimate statistic p.value parameter conf.low conf.high method
<dbl> <chr> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <chr>
1 4 disp -0.805 -4.07 0.00278 9 -0.947 -0.397 Pears…
2 4 drat 0.424 1.41 0.193 9 -0.236 0.816 Pears…
3 4 hp -0.524 -1.84 0.0984 9 -0.855 0.111 Pears…
4 4 qsec -0.236 -0.728 0.485 9 -0.732 0.424 Pears…
5 4 wt -0.713 -3.05 0.0137 9 -0.920 -0.198 Pears…
6 6 disp 0.103 0.232 0.826 5 -0.705 0.794 Pears…
7 6 drat 0.115 0.258 0.807 5 -0.699 0.799 Pears…
如果您需要使用cor.test,下面是使用扫帚的选项:
library(broom)
library(tidyr)
library(dplyr)
mtcars[,1:7] %>%
pivot_longer(-c(mpg,cyl)) %>%
group_by(cyl,name) %>%
do(tidy(cor.test(.$mpg,.$value)))
# A tibble: 15 x 10
# Groups: cyl, name [15]
cyl name estimate statistic p.value parameter conf.low conf.high method
<dbl> <chr> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <chr>
1 4 disp -0.805 -4.07 0.00278 9 -0.947 -0.397 Pears…
2 4 drat 0.424 1.41 0.193 9 -0.236 0.816 Pears…
3 4 hp -0.524 -1.84 0.0984 9 -0.855 0.111 Pears…
4 4 qsec -0.236 -0.728 0.485 9 -0.732 0.424 Pears…
5 4 wt -0.713 -3.05 0.0137 9 -0.920 -0.198 Pears…
6 6 disp 0.103 0.232 0.826 5 -0.705 0.794 Pears…
7 6 drat 0.115 0.258 0.807 5 -0.699 0.799 Pears…
非常感谢。这是一个很好的解决方案。但是我在理解do()函数时遇到了问题。另外,我想问一下,如果变量cyl不是数字,我如何修改第二个解决方案。当您使用group_by()时然后是Summary或tally等。如果您想在group_by下的每个组上使用非dplyr函数或自定义函数,它将是do()…它不必是数字,我只使用mtcars$cyl进行拆分。您注意到了一个好的点,我没有在列中排除cyl进行关联,我现在可以更正这一点。谢谢。第二种解决方案对大型数据集非常有用。非常感谢。这是一个很好的解决方案。但是我在理解do()时遇到了问题函数。另外,我想问一下,如果变量cyl不是数字,我如何修改第二个解决方案。当您执行group_by()后接say SUMMARE或tally等操作时。如果您想在group_by下的每个组上使用非dplyr函数或自定义函数,它将是do()…它不必是数字,我只使用mtcars$cyl进行拆分。你注意到了一个好的点,我没有在列中排除cyl进行关联,我现在可以更正。谢谢。第二种解决方案对大型数据集非常有用。谢谢。这对我来说很有效。你能简单解释一下花括号部分吗?我不知道它是如何实现的有效。谢谢。这对我有效。你能简单解释一下花括号的部分吗?我不知道它是怎么工作的。
#define columns to correlate
cor_vars = setdiff(colnames(mtcars)[1:7],"cyl")
split(mtcars[,1:7],mtcars$cyl) %>%
map_dfr(~data.frame(x="mpg",y=cor_vars,
cyl=unique(.x$cyl),rho=as.numeric(cor(.x$mpg,.x[,cor_vars]))))
x y cyl rho
1 mpg mpg 4 1.00000000
2 mpg disp 4 -0.80523608
3 mpg hp 4 -0.52350342
4 mpg drat 4 0.42423947
5 mpg wt 4 -0.71318483
6 mpg qsec 4 -0.23595389
7 mpg mpg 6 1.00000000
8 mpg disp 6 0.10308269
9 mpg hp 6 -0.12706785
10 mpg drat 6 0.11471598
11 mpg wt 6 -0.68154982
12 mpg qsec 6 -0.41871779
13 mpg mpg 8 1.00000000
14 mpg disp 8 -0.51976704
15 mpg hp 8 -0.28363567
16 mpg drat 8 0.04793248
17 mpg wt 8 -0.65035801
18 mpg qsec 8 -0.10433602