如何在R中对dataframe每列应用函数,实现各列值除以对应列标准差
原代码问题梳理
- 语法结构错误:for循环的参数、大括号配对都不符合R的语法规则
- 逻辑杂糅:循环遍历逻辑和自定义函数的定义没有关联,也没有实际对数据集的列执行赋值操作
- R的for循环默认不会返回计算结果,无法直接赋值给
new对象
实现方案
方法1:基础R实现(无需安装额外包)
适合新手理解,直接遍历前168列做计算:
# 先复制原数据集到新对象,避免覆盖原数据 new_df <- df # 遍历前168列,每列值除以该列的标准差(na.rm=TRUE自动跳过空值) for (i in 1:168) { new_df[,i] <- new_df[,i] / sd(new_df[,i], na.rm = TRUE) }
如果不想手动数列数,只要排除最后一列ID列的话,可以改成:
new_df <- df # ncol(new_df)-1 代表总列数减1,自动排除最后一列ID for (i in 1:(ncol(new_df)-1)) { new_df[,i] <- new_df[,i] / sd(new_df[,i], na.rm = TRUE) }
方法2:tidyverse简洁实现
如果你已经安装了tidyverse系列包,用dplyr的列操作语法更简洁:
library(dplyr) new_df <- df %>% # across(-ncol(.))代表除了最后一列之外的所有列,统一执行指定计算 mutate(across(-ncol(.), ~.x / sd(.x, na.rm = TRUE)))
结果验证
你可以运行sd(new_df$var1)查看处理后的列标准差,处理后对应列的标准差为1,说明计算符合预期。
内容的提问来源于stack exchange,提问作者Carolin V
相关产品推荐
相关产品推荐

