如何将R语言data.frame列名从X1~X7改为Brand~Date并设因子类型
解决R中data.frame列名替换与类型转换问题
刚好遇到过类似的场景,给你两种实用的方案,都能完美实现你想要的效果:
先还原你的原始数据(方便直接测试)
先把你提供的myPhoneHTML数据框构造出来,你可以直接复制这段代码运行:
myPhoneHTML <- data.frame( X1 = c("Brand", "Apple", "HTC", "HTC", "ASUS", "ASUS"), X2 = c("Model", "iPhone7", "OneM8", "OneS9", "ZenFoneDeluxe", "ZenFoneZoom"), X3 = c("Price", "24500", "21900", "9990", "8990", "15990"), X4 = c("Screen", "4.7", "5", "5", "5.5", "5.5"), X5 = c("Weight", "138", "160", "158", "170", "185"), X6 = c("GB", "32", "16", "32", "16", "64"), X7 = c("Date", "20160916", "20140328", "20160617", "20150827", "20151201"), stringsAsFactors = FALSE )
方案一:基础R语法(无需额外包)
如果不想加载第三方包,用基础R就能完成所有操作:
# 1. 将第一行的文本设为正式列名 colnames(myPhoneHTML) <- myPhoneHTML[1, ] # 2. 删除原来的第一行(它已经完成了列名的使命) myPhoneHTML <- myPhoneHTML[-1, ] # 3. 转换列类型:把Brand和Model设为因子,其余列转为数值型 myPhoneHTML$Brand <- factor(myPhoneHTML$Brand) myPhoneHTML$Model <- factor(myPhoneHTML$Model) myPhoneHTML[, c("Price", "Screen", "Weight", "GB", "Date")] <- lapply( myPhoneHTML[, c("Price", "Screen", "Weight", "GB", "Date")], as.numeric )
方案二:tidyverse管道写法(更简洁易读)
如果你平时习惯用tidyverse工具链,代码会更紧凑清晰,记得先加载dplyr包:
library(dplyr) myPhoneHTML <- myPhoneHTML %>% # 把第一行的值赋值为列名 `colnames<-`(.[1, ]) %>% # 移除第一行冗余数据 slice(-1) %>% # 批量转换列类型:指定列转因子,其余转数值 mutate( across(c(Brand, Model), factor), across(c(Price, Screen, Weight, GB, Date), as.numeric) )
验证结果
执行完代码后,你可以用str(myPhoneHTML)查看列的类型是否符合要求,用print(myPhoneHTML)就能看到和你预期完全一致的数据框结构了。
内容的提问来源于stack exchange,提问作者連振宇
相关产品推荐
相关产品推荐

