R语言使用for循环标准化dataframe触发越界错误如何解决
问题原因
- 越界报错的直接原因是
mean_B2、sd_B2的维度和原数据不匹配:你在apply中定义的函数返回的是每列所有元素除以对应列统计量的结果,共6个值,转置后得到的是4行6列的矩阵,而原数据是6行4列,循环中索引i超过4时就会触发越界。 - 统计量计算逻辑错误:你需要的是每列单个均值、单个标准差,而非每个元素除以统计量的结果。
- 标准化公式错误且存在运算优先级问题:Z-score标准化的正确公式是
(原始值 - 列均值)/列标准差,你的写法先计算除法再做减法,即使维度正确也得不到预期结果。
修复方案
方案1:保留for循环的实现
先正确计算每列的均值和标准差,再按正确公式循环赋值:
survey_B <- data.frame("q1" = c(5, 3, 2, 7, 1, 9), "q2" = c(4, 2, 2, 5, 1, 10), "q3" = c(2, 1, 4, 2, 9, 10), "q4" = c(10, 5, 2, 10, 4, 2)) # 计算每列的均值、标准差,每个列返回1个统计值,得到长度为4的向量 col_mean <- apply(survey_B, 2, mean) col_sd <- apply(survey_B, 2, sd) # 循环执行标准化 for(i in 1:nrow(survey_B)) { for(j in 1:ncol(survey_B)) { survey_B[i,j] = (survey_B[i,j] - col_mean[j]) / col_sd[j] } }
方案2:更简洁的向量化实现(无需循环)
R内置的scale()函数默认就是按列执行Z-score标准化,一行代码即可完成操作:
survey_B_standardized <- as.data.frame(scale(survey_B))
内容的提问来源于stack exchange,提问作者Matthias Prommer
相关产品推荐
相关产品推荐

