如何在R语言循环中每次移除数据框一行并执行相关性检验?
解决方案
1. 明确需求:选择存储的相关系数类型
首先要确定你需要存储的是完整相关矩阵还是指定变量对的相关系数,再选择对应的存储方式:
示例1:存储每次删行后的完整相关矩阵(用列表)
用列表来保存每次的相关矩阵,避免向量无法存储多维数据的问题:
rnpo <- data.frame(h.move.ten = c(25.85, 51.375, 26.007, 35.249, 30.841), move.ten = c(3.231, 0.000, 4.334, 4.745, 0.000), reor.ten = c(0.000, 3.626, 1.181, 2.027, 2.457), hbob.ten = c(3.398, 17.934, 7.050, 1.075, 0.943)) # 创建空列表存储结果 store_cor_list <- vector("list", nrow(rnpo)) for (i in 1:nrow(rnpo)) { droprow <- rnpo[-i, ] store_cor_list[[i]] <- cor(droprow) } # 查看删除第1行后的相关矩阵 store_cor_list[[1]]
示例2:存储指定变量对的相关系数(如h.move.ten和move.ten)
如果只需要某一对变量的相关系数,直接指定列计算并存储到向量中:
store_cor_vec <- numeric(nrow(rnpo)) for (i in 1:nrow(rnpo)) { droprow <- rnpo[-i, ] # 计算指定两列的皮尔逊相关系数 store_cor_vec[i] <- cor(droprow$h.move.ten, droprow$move.ten) } # 查看结果 store_cor_vec
2. 修复sapply代码的行删除问题
在sapply中,必须用rnpo[-x, ](添加逗号)明确指定删除行,同时根据需求选择返回向量或列表:
用sapply存储指定变量对的相关系数
data_ind <- 1:nrow(rnpo) store_cor_vec <- sapply(data_ind, function(x) { droprow <- rnpo[-x, ] cor(droprow$h.move.ten, droprow$move.ten) }) store_cor_vec
用sapply存储完整相关矩阵(返回列表)
若要返回每次的完整相关矩阵,需设置simplify = FALSE让sapply返回列表:
store_cor_list <- sapply(data_ind, function(x) { cor(rnpo[-x, ]) }, simplify = FALSE) # 查看删除第2行后的相关矩阵 store_cor_list[[2]]
内容的提问来源于stack exchange,提问作者Satabdi Mandal
相关产品推荐
相关产品推荐

