R语言中标准化data.frame变量后无法访问新变量的问题
你的标准化函数问题分析与修正方案
我帮你看了下写的函数,问题主要出在这几个地方,咱们一步步捋清楚:
原函数的核心问题
- 错误的赋值方式:你把所有标准化后的列都塞进了
dataframe$s这个单一列里,导致s其实是一个嵌套在原数据框里的子数据框,而不是单独的s.wt、s.mpg这类列,自然没法直接访问。 - 未添加指定前缀:就算赋值方式正确,你也没给标准化后的列名加上
s.前缀,达不到你想要的命名效果。 - 缺少返回值:函数最后没有返回处理好的dataframe,所以你调用函数后,原数据框根本不会被修改,也拿不到新的结果。
修正后的函数代码
standard <- function(dataframe = mtcars){ # 获取原数据框的所有变量名 var.names <- names(dataframe) # 对每个变量执行标准化操作,得到列表格式的结果 scaled_cols <- lapply(dataframe[, var.names], scale) # 给标准化后的列名加上`s.`前缀 names(scaled_cols) <- paste0("s.", var.names) # 将标准化后的列合并到原数据框中 dataframe <- cbind(dataframe, as.data.frame(scaled_cols)) # 返回处理完成的最终数据框 return(dataframe) }
怎么使用修正后的函数
调用函数后记得把结果赋值给一个新变量,这样就能直接访问带s.前缀的标准化变量了:
# 处理mtcars数据 modified_mtcars <- standard(mtcars) # 查看标准化后的s.wt变量前6行 head(modified_mtcars$s.wt)
补充说明
原函数里如果硬要访问嵌套的标准化变量,得写dataframe$s$wt,但这显然不是你想要的效果。修正后的代码把每个标准化变量都作为独立列添加到原数据框,命名规则完全符合你的需求,而且函数会返回完整的处理结果,调用后就能直接使用啦。
内容的提问来源于stack exchange,提问作者rnorouzian
相关产品推荐
相关产品推荐

