假设我有一个数据框:
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)
我正在尝试创建一个可以完成三件事的函数...
这是我想出的,但是找不到找到进一步的方法。
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)
}
}
答案 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