【发布时间】:2016-09-06 07:16:54
【问题描述】:
一个数据框有 20 列,我想找到列“a”与其余列的相关性。
我如何使用 dplyr 来做到这一点?
我知道如何做这样的个别关联:
test %>%
dplyr::summarize(cor(a, b))
或 summarise_each 表示平均值。
但是我该如何做相关性呢?
两个用例:
- 它计算与数据框中每列的相关性。
- 它计算与我提到的列的相关性。
【问题讨论】:
一个数据框有 20 列,我想找到列“a”与其余列的相关性。
我如何使用 dplyr 来做到这一点?
我知道如何做这样的个别关联:
test %>%
dplyr::summarize(cor(a, b))
或 summarise_each 表示平均值。
但是我该如何做相关性呢?
两个用例:
【问题讨论】:
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 上的focus_.cor_df() here。
【讨论】:
dat %>% select(-cat1, -cat2, ...) %>% correlate() ...)或选择您感兴趣的列,就像我上面的第二个示例一样。
不太了解我认为您可能需要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
【讨论】: