R函数可匹配列名并自动将相关性制成表格

时间:2018-07-27 20:48:30

标签: r

假设我有一个数据框:

library(psych)
x.1 <- acs(1, 3, 5)
y.1 <- acs(2, 6, 8)
x.2 <- acs(2, 3, 4)
y.2 <- acs(5, 10, 15)
df <- data.frame(x.1, y.1, x.2, y.2)

我正在尝试创建一个可以完成三件事的函数...

  1. 将列名的第一个字符(x或y)与共享该第一个字符但不共享最后一个字符(1或2)的所有其他变量匹配
  2. 计算这些变量之间的相关性
  3. 在简单的两列表中处理相关性,该表在第一列中列出了变量,在第二列中列出了相关性

这是我想出的,但是找不到找到进一步的方法。

    FS.function <- function(x) {

  colnames <- colnames(x)

  for i in colnames[x] {

    if (substring(colnames[i], 1, 2) == substring(colnames[i], 1, 2) & str_sub(colnames[i], -1, -1) != str_sub(colnames[i], -1, -1) {

      var1 <- colnames(x)[i]
      r <- corr.test(X1, X2)

    }
  }

2 个答案:

答案 0 :(得分:0)

我认为您不需要acs()。也许您正在寻找c()创建向量? 无论如何,这可能会让您迷路:

FS = function(df) {
  first_letter_shortlist = unique(substr(names(df),1,1))
  result = list()

  for (letter in first_letter_shortlist) {
    regexp = paste0("^", letter)
    cn = grep(pattern = regexp, x = names(df))
    result[[letter]] = cor(df[,cn])
  }
  return(result)
}

如果两个以上的列以相同的字母开头,这也将为您提供相关性。

要对其进行测试,请尝试:

x.1 <- c(1, 3, 5)
y.1 <- c(2, 6, 8)
x.2 <- c(2, 3, 4)
y.2 <- c(5, 10, 15)
df <- data.frame(x.1, y.1, x.2, y.2)

FS(df)

答案 1 :(得分:0)

由于每个组可能有两个以上的变量,所以我添加了另一个x。 为了省略结果中的冗余,将相关矩阵的上三角和对角线上的所有值都设置为NA,然后将其删除。

library(tidyverse)
set.seed(1)
x.1 <- rnorm(100)
x.2 <- rnorm(100) + 0.7 * x.1
x.3 <- rnorm(100)
y.1 <- rnorm(100)
y.2 <- rnorm(100)
df <- data.frame(x.1, y.1, x.2, y.2, x.3)

groups   <- split(names(df), substring(names(df), 1,1))
cor_list <- lapply(groups, function(x) { 
                     cm <- data.frame(cor(df[ ,x]))
                     cm[upper.tri(cm, diag = TRUE)] <- NA
                     cm %>% rownames_to_column("var1")%>% 
                     gather("var2", "correlation", -var1)}) %>% 
  bind_rows %>% na.omit

 cor_list
 #     var1 var2 correlation
 # 2   x.2  x.1  0.54815545
 # 3   x.3  x.1  0.01838219
 # 6   x.3  x.2 -0.03133936
 # 11  y.2  y.1  0.02388991