【问题标题】:Calculate correlation for two data frames for all columns after group_by in R计算 R 中 group_by 之后所有列的两个数据帧的相关性
【发布时间】:2022-01-06 03:53:47
【问题描述】:

样本数据:

A <- data.frame(region = c("US","US", "UK","UK","AUS","AUS"), a = c(1,2,3,4,5,8), b = c(4,5,6,7,8,2), c = c(9,6,5,43,2,5))
B <- data.frame(region = c("US","US", "UK","UK","AUS","AUS"),a = c(7,4,3,6,9,81), b = c(9,4,3,7,0,35), c = c(22,5,6,2,9,33))

预期输出: (x 是区域中两个数据框之间的列的相关性)

我尝试过: 将两个数据框合二为一,计算一个数据框中两列之间的相关性。键入每个列名有点繁琐,这也会创建太多列。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 例如,单元格 (US, a) 中的值将是 cor(c(1,2), c(7,4))?

标签: r dplyr correlation


【解决方案1】:

如果我的理解不正确,那么这里是使用dplyr 和tidyr 的解决方案。

library(dplyr)
library(tidyr)

rbind(cbind(set = "A", A), cbind(set = "B", B)) %>% 
  pivot_longer(-c(set, region)) %>% 
  group_by(region, name) %>% 
  summarise(value = cor(value[set == "A"], value[set == "B"]), .groups = "drop") %>% 
  pivot_wider()

输出

# A tibble: 3 x 4
  region     a     b     c
  <chr>  <dbl> <dbl> <dbl>
1 AUS        1    -1     1
2 UK         1     1    -1
3 US        -1    -1     1

【讨论】:

  • 感谢您的回答!我收到一条错误消息,提示“在新窗口中显示错误:必须命名第 1 列。使用 .name_repair 指定修复。”如果我只在将代码转换为更广泛的格式之前运行代码,它只会显示一个值而不是按组显示的值
  • 现在一切顺利!这只是因为我的系统中也有 plyr。我在summary前面添加了“dplyr::”并解决了这个问题。再次感谢!
【解决方案2】:

这有点令人费解,但它是一种替代方法。

library(tidyverse)

A <- data.frame(region = c("US","US", "UK","UK","AUS","AUS"), a = c(1,2,3,4,5,8), b = c(4,5,6,7,8,2), c = c(9,6,5,43,2,5))
B <- data.frame(region = c("US","US", "UK","UK","AUS","AUS"),a = c(7,4,3,6,9,81), b = c(9,4,3,7,0,35), c = c(22,5,6,2,9,33))

(df <- map(list(A, B), ~nest_by(.x, region)) %>% 
       reduce(inner_join, by = 'region')) 
#> # A tibble: 3 × 3
#> # Rowwise:  region
#>   region             data.x             data.y
#>   <chr>  <list<tibble[,3]>> <list<tibble[,3]>>
#> 1 AUS               [2 × 3]            [2 × 3]
#> 2 UK                [2 × 3]            [2 × 3]
#> 3 US                [2 × 3]            [2 × 3]

bind_cols(select(df, region), map2_dfr(df$data.x, df$data.y, ~map2_dfc(.x, .y, ~cor(.x, .y))))
#> # A tibble: 3 × 4
#> # Rowwise:  region
#>   region     a     b     c
#>   <chr>  <dbl> <dbl> <dbl>
#> 1 AUS        1    -1     1
#> 2 UK         1     1    -1
#> 3 US        -1    -1     1

由reprex package (v2.0.1) 于 2022-01-06 创建

【讨论】:

    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多