如何在R中正确对齐.csv导入数据并修正含点的列名?
问题原因
你使用read.table()导入csv文件时没有指定正确的分隔符,csv文件默认的字段分隔符为逗号,而read.table()默认将任意空白字符作为分隔符,因此会把整行内容识别为单独1列;同时read.table()默认开启check.names参数,会将列名中不合规的逗号自动替换为点号,就出现了你看到的列名异常。
解决方案
方案1:重新导入数据(最推荐,操作最简单)
直接使用R内置的read.csv()函数即可,它是专门适配csv格式的导入函数,默认分隔符为逗号,也会自动保留合法的下划线列名:
mydata <- read.csv(file.choose(), header = TRUE) # 验证导入结果 head(mydata)
如果你坚持要用read.table(),手动指定分隔符参数即可:
mydata <- read.table(file.choose(), header = TRUE, sep = ",")
方案2:已有导入结果无需重新读取的处理方法
如果不想重复选择文件,可以直接对已导入的数据做拆分处理:
tidyverse写法(更简洁)
先安装加载包(已安装可跳过安装步骤):
install.packages("tidyverse") library(tidyverse)
执行拆分转换:
mydata_new <- mydata %>% # 按逗号拆分现有单列,指定对应列名 separate(col = 1, into = c("Tail_Length", "Wing_Length", "Gender"), sep = ",") %>% # 将尾长、翅长列转为数值型 mutate(across(c(Tail_Length, Wing_Length), as.numeric))
基础R写法(无需安装第三方包)
# 拆分单列内容 split_data <- strsplit(mydata[,1], ",") # 组装为新数据框 mydata_new <- data.frame( Tail_Length = as.numeric(sapply(split_data, "[", 1)), Wing_Length = as.numeric(sapply(split_data, "[", 2)), Gender = as.integer(sapply(split_data, "[", 3)) )
小提示:不建议频繁使用attach(mydata),容易引发不同数据框的列名冲突,直接用mydata$列名的方式调用字段更稳妥。
内容的提问来源于stack exchange,提问作者Dwai
相关产品推荐
相关产品推荐

