【问题标题】:Finding correlations of columns查找列的相关性
【发布时间】:2022-01-06 18:19:13
【问题描述】:

前言我是 R 的初学者,渴望学习。请不要将问题的简单性(如果它是一个简单的答案)误认为缺乏研究或努力!

我有一个名为 data 的 data.table,其列标记为 V1 到 V20。我想获取某些列(1、6、7、9、10 和 11)相对于 V18 的相关性,这样我就有一个如下所示的新表

Variable     Correlation_to_V18
V1              cor(V1,V18)
V6              cor(V6,V18)
V7              cor(V7,V18)
V9              cor(V9,V18)
V10             cor(V10,V18)
V11             cor(V11,V18)

我尝试使用 for 循环无济于事

column <- c(1,6,7,9,10,11)
for (i in column) {
  correlations<-cor(data[,18], data[,as.numeric(i)])
  cor_table<- data.table(variables = colnames(data[,as.numeric(column)]), correlation_val = correlations)
  return(cor_table)
}

【问题讨论】:

  • 我对列 name Correlation_to_V1 感到困惑,暗示(推断?)意味着 cor(V6,V18) 没有使用 V1。此外,不能从for 循环中return,不确定您最终希望得到什么。您是否希望基于您的真实data 聚合的新框架?如果您提供一个简单/小样本框架,其中包含实际 cor 值和实际输出,那将非常有帮助;无论您如何创建实际输出,您都可以根据需要在 Excel 中制作 CSV。
  • @r2evans 我已经纠正了一些错误。我试图找到第 1、6、7、9、10 和 11 列相对于第 18 列的相关性,因此命名为 Correlation_to_V18。最后,我想要一个数据表,其中一列列出了我用来计算与 V18 的相关性的变量,另一列列出了相关性值
  • 您可以使用 cor(data) 成对得到所有列的相关矩阵,然后选择您需要的并相应地命名它们 cor(data)[c("V1","V6" "V7","V9","V10"),"V18"]。 return 通常用于函数,但在 for 循环中不是必需的。

标签: r dataframe data.table


【解决方案1】:

让我们制作一些听起来像您的数据的数据(50 行 x 20 列):

library(dplyr)
library(tidyr)
library(corrr)

set.seed(123)
df1 <- data.frame(matrix(rnorm(1000), 
                  ncol = 20, 
                  nrow = 50, 
                  dimnames = list(c(), paste0("V", 1:20))))

通常在使用 R 时,使用循环处理数据帧是个坏主意。有 apply 函数、tidyverse 包和其他包,可以更轻松地处理数据帧。

在这种情况下,我将使用corrr 库返回具有相关系数的数据框。然后,您可以过滤感兴趣的术语V18,将输出从“宽”重塑为“长”,然后再次过滤其他变量。

correlate(df1) %>% 
  filter(term == "V18") %>% 
  pivot_longer(2:21) %>% 
  filter(name %in% c("V1", "V6", "V7", "V9", "V10", "V11"))

结果:

# A tibble: 6 x 3
  term  name    value
  <chr> <chr>   <dbl>
1 V18   V1     0.125 
2 V18   V6    -0.167 
3 V18   V7     0.345 
4 V18   V9    -0.110 
5 V18   V10    0.0473
6 V18   V11   -0.0347

【讨论】:

  • 循环数据帧有什么问题?我一直在数据帧上使用应用函数。鉴于它们是列表,我认为它们非常适合循环播放?
  • 我也使用应用函数——它们不是循环。
  • 他们是!但优化了循环。
  • 事实上,R 的向量化操作是循环 - 但循环发生在 C 级别。参见例如noamross.net/archives/2014-04-16-vectorization-in-r-why
  • 是的,我指的是 for 循环,就像在原始问题中一样。我们现在可以停止这次谈话吗?
【解决方案2】:

这对于 apply 系列来说是相当直接的。感谢用户 neilfws 提供的数据。+1

set.seed(123)
df <- data.frame(matrix(rnorm(1000), ncol = 20, nrow = 50, dimnames = list(c(), paste0("V", 1:20))))

stack(lapply(df[names(df)!="V18"], function(x) cor(df$V18, x)))
#>           values ind
#> 1   1.247235e-01  V1
#> 2  -3.219809e-02  V2
#> 3  -9.556828e-05  V3
#> 4  -1.912672e-01  V4
#> 5  -7.489594e-02  V5
#> 6  -1.669195e-01  V6
#> 7   3.449937e-01  V7
#> 8  -1.968900e-01  V8
#> 9  -1.099080e-01  V9
#> 10  4.732393e-02 V10
#> 11 -3.465666e-02 V11
#> 12  2.002576e-01 V12
#> 13 -4.510807e-02 V13
#> 14 -2.545680e-01 V14
#> 15 -1.679573e-03 V15
#> 16  7.318178e-02 V16
#> 17  6.446624e-02 V17
#> 18  1.999834e-01 V19
#> 19  1.120717e-01 V20

您在没有感兴趣的列的情况下遍历您的数据框。当您决定使用 lapply 时,您最终会得到一个列表,您可以使用 stack 轻松堆叠到数据框。

【讨论】:

  • 您还可以通过将“V18”替换为变量而不是常量来使其更具程序性
【解决方案3】:

这是另一个潜在的解决方案:

library(data.table)
set.seed(123)
mat <- matrix(runif(400), nrow = 20, ncol = 20)
data <- data.table(mat)

columns_of_interest <- c(1,6,7,9,10,11,18)
data_subset <- data[, columns_of_interest, with=FALSE]
data_cor_values <- data_subset[, .(Correlation_to_V18 = cor(.SD, V18))]
data_cor_values[, variable := columns_of_interest]
data_cor_values
#>    Correlation_to_V18.V1 variable
#> 1:          -0.049812188        1
#> 2:          -0.375566877        6
#> 3:           0.089879501        7
#> 4:          -0.022499113        9
#> 5:          -0.007267059       10
#> 6:          -0.178489961       11
#> 7:           1.000000000       18

# Trim the last row (V18)
data_cor_values[1:.N-1,]
#>    Correlation_to_V18.V1 variable
#> 1:          -0.049812188        1
#> 2:          -0.375566877        6
#> 3:           0.089879501        7
#> 4:          -0.022499113        9
#> 5:          -0.007267059       10
#> 6:          -0.178489961       11

# Check the answer is correct:
cor(data_subset$V1, data_subset$V18)
#> [1] -0.04981219
cor(data_subset$V6, data_subset$V18)
#> [1] -0.3755669

reprex package (v2.0.1) 于 2021 年 11 月 30 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2021-07-10
    • 1970-01-01
    • 2016-12-20
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多