R语言中data.frame新增列未成功赋予指定列名问题
问题原因分析
当你对单列data.frame(比如mtcars["wt"])使用scale()函数时,返回的结果是一个带有原始列名的矩阵(列名仍然是wt)。当你尝试通过data[, paste0(names(data), ".bbb") ] <- d赋值时,R会优先使用矩阵d自带的列名,而不是你在方括号中指定的名称,所以新添加的列名还是wt,而非预期的wt.bbb。
解决办法
这里有几种简单的修复方式,你可以根据自己的习惯选择:
方法1:将缩放结果转为向量(移除列名)
直接提取缩放矩阵的第一列作为向量,这样赋值时就不会带入原始列名:
data <- mtcars["wt"] d <- scale(data)[, 1] # 或者用 as.vector(scale(data)) data[, paste0(names(data), ".bbb") ] <- d
方法2:修改缩放结果的列名后再合并
先给缩放后的矩阵设置新列名,再和原始数据合并:
data <- mtcars["wt"] d <- scale(data) colnames(d) <- paste0(names(data), ".bbb") data <- cbind(data, d)
方法3:用tidyverse工具更直观地操作
如果你习惯使用dplyr,可以用mutate()直接创建新列,避免列名冲突问题:
library(dplyr) data <- mtcars %>% select(wt) %>% mutate(wt.bbb = scale(wt))
执行任意一种方法后,再查看data的列名,就能看到预期的wt和wt.bbb了。
内容的提问来源于stack exchange,提问作者user7649990
相关产品推荐
相关产品推荐

