如何在dplyr中使用summarise_each进行相关?

时间:2016-09-05 22:19:41

标签: r dplyr

数据框有20列,我想找到列“a”与其余列的相关性。

如何使用dplyr进行操作?

我知道如何进行个别相关,例如:

test %>%
  dplyr::summarize(cor(a, b))

或者summaryrise_each表示意思。

但我怎么能做到相关呢?

两个用例:

  1. 计算数据框中每个其他列的相关性。
  2. 在哪里计算与我提到的列的相关性。

2 个答案:

答案 0 :(得分:5)

corrr包使用dplyr作为后端(并且很容易使用它)通过correlate() %>% focus()执行此操作:

library(corrr)

mtcars %>% 
  correlate() %>% 
  focus(mpg)
#> # A tibble: 10 × 2
#>    rowname        mpg
#>      <chr>      <dbl>
#> 1      cyl -0.8521620
#> 2     disp -0.8475514
#> 3       hp -0.7761684
#> 4     drat  0.6811719
#> 5       wt -0.8676594
#> 6     qsec  0.4186840
#> 7       vs  0.6640389
#> 8       am  0.5998324
#> 9     gear  0.4802848
#> 10    carb -0.5509251

mtcars %>% 
  select(mpg, disp, hp) %>% 
  correlate() %>% 
  focus(mpg)
#> # A tibble: 2 × 2
#>   rowname        mpg
#>     <chr>      <dbl>
#> 1    disp -0.8475514
#> 2      hp -0.7761684

focus()的行为类似于dplyr::select(),但它排除了行中剩余的任何列。如果有兴趣,请查看GitHub source code上的focus_.cor_df()

答案 1 :(得分:1)

我不太了解我认为你可能需要combn函数的两个用例,但是:

  

我想找到列“a”与其余列的相关性。

您可以执行以下操作,直接将列a作为参数之一传递给cor函数,并使用.代表其余列:

library(dplyr)
df <- data.frame(a = rnorm(5), b = rnorm(5), c = rnorm(5))
df %>% summarise_each(funs(cor(., df$a)), -a)

#           b          c
# 1 0.1997687 -0.3541925

如果存在非数字列并且您只对数字列感兴趣,则可能需要summarise_if函数并将条件指定为数字,在这种情况下,只会汇总数字列和相应的相关系数计算:

df <- data.frame(a = rnorm(5), b = rnorm(5), c = rnorm(5), d = letters[1:5])
df %>% summarise_if(is.numeric, funs(cor(., df$a)))
#  a         b           c
#1 1 0.1153882 -0.03117205