如何使用for循环或更高效方案简化R语言相关系数矩阵生成代码
R语言分组计算变量相关性矩阵的实现方案
你需要实现的是按ID分组,分别计算每组中后缀为.1和.2的同变量对的皮尔逊相关系数,最终填充到预设的相关系数矩阵中。以下是两种可行实现方式:
现有基础代码(你已提供)
# Create data frame ID <- c("r1", "r1", "r1", "r1", "r1", "r2", "r2", "r2", "r2", "r2", "r3", "r3", "r3", "r3", "r3") V1.1 <- c(3, 3, 3, 3, 3, 3, 2, 3, 3, 1, 2, 2, 1, 1, 2) V2.1 <- c(2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3) V3.1 <- c(4, 4, 4, 4, 3, 4, 1, 2, 5, 2, 2, 2, 4, 5, 1) V4.1 <- c(3, 4, 3, 3, 3, 3, 3, 3, 4, 4, 5, 4, 4, 4, 2) V5.1 <- c(3, 2, 3, 3, 2, 3, 2, 2, 2, 3, 2, 3, 3, 3, 3) V1.2 <- c(4, 4, 3, 3, 4, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3) V2.2 <- c(3, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5) V3.2 <- c(2, 1, 2, 2, 2, 4, 3, 4, 4, 3, 4, 2, 1, 2, 1) V4.2 <- c(2, 5, 2, 3, 4, 4, 3, 4, 2, 3, 4, 5, 2, 4, 3) V5.2 <- c(5, 4, 3, 4, 3, 3, 4, 4, 2, 3, 2, 4, 4, 1, 3) df <- data.frame(ID, V1.1, V2.1, V3.1, V4.1, V5.1, V1.2, V2.2, V3.2, V4.2, V5.2) # Define variables ID.vars <- c("r1", "r2", "r3") vars <- c("V1", "V2", "V3", "V4", "V5") vars.1 <- c("V1.1", "V2.1", "V3.1", "V4.1", "V5.1") vars.2 <- c("V1.2", "V2.2", "V3.2", "V4.2", "V5.2") # Empty data frame for correlation matrix corrmat <- data.frame(ID = ID.vars) corrmat <- cbind(corrmat, matrix(NA, nrow = length(ID.vars), ncol = length(vars))) names(corrmat)[2:ncol(corrmat)] <- vars
方案1:补全你未完成的for循环
只需要在内层循环中构造对应变量名,计算相关系数后赋值到预设矩阵即可:
for(i in ID.vars) { results <- subset(df, ID == i, select = c(vars.1, vars.2)) # 按ID取子集 # 遍历每个变量计算对应.1和.2列的相关性 for(j in vars){ col1 <- paste0(j, ".1") col2 <- paste0(j, ".2") corrmat[corrmat$ID == i, j] <- cor(results[[col1]], results[[col2]]) } }
执行完上述代码后corrmat就是你需要的结果。
方案2:更简洁的tidyverse向量化实现(无需手动写循环)
如果使用tidyverse生态的工具,可以大幅简化代码,可读性和扩展性更强:
library(dplyr) corrmat <- df %>% group_by(ID) %>% summarize( V1 = cor(V1.1, V1.2), V2 = cor(V2.1, V2.2), V3 = cor(V3.1, V3.2), V4 = cor(V4.1, V4.2), V5 = cor(V5.1, V5.2) )
如果变量数量多不想逐个手动编写,还可以用across进一步简化:
corrmat <- df %>% group_by(ID) %>% summarize(across(all_of(vars), ~ cur_data()[[paste0(cur_column(), ".1")]] %>% cor(cur_data()[[paste0(cur_column(), ".2")]])))
内容的提问来源于stack exchange,提问作者xidelos
相关产品推荐
相关产品推荐

