数据文件的读写—R实现
在数据分析和统计建模中,数据导入是进行数据分析的第一步。R 语言作为一门强大的数据分析工具,支持从多种文件格式中读取数据,包括文本文件(如 .txt、.csv)、Excel 文件(如 .xls、.xlsx)、剪贴板(clipboard)、数据库、网页数据、JSON 文件、XML 文件等。R 提供了丰富的内置函数和扩展包,能够高效地导入和管理这些数据文件。在实际的数据分析任务中,选择合适的读取方法和函数,可以有效提高数据导入的速度和准确性。
文件格式 | R 函数 | 描述 |
---|---|---|
.txt |
read.table() |
读取文本文件,支持灵活的分隔符和列名定义 |
.csv |
read.csv() ,readr::read_csv() |
读取逗号分隔文件,支持快速读取大文件 |
.xlsx |
readxl::read_excel() |
读取 Excel 文件,支持多工作表和指定范围 |
.json |
jsonlite::fromJSON() |
读取 JSON 格式文件 |
.sav |
haven::read_sav() |
读取 SPSS 文件 |
.dta |
haven::read_dta() |
读取 Stata 文件 |
.rds |
readRDS() |
读取 R 的二进制数据文件 |
.feather |
arrow::read_feather() |
读取 Feather 格式文件(高效) |
一、工作路径
在 R 语言中,工作路径(Working Directory) 是指当前 R 会话中默认读取和保存文件的路径。R 执行文件操作(如读取或保存数据文件)时,如果未指定完整路径,R 将在当前工作路径下寻找文件。了解和管理 R 的工作路径是进行数据分析的基础,可以确保文件读取和保存的稳定性和一致性。
1.1 获取工作路径
R 提供了 getwd() 函数来获取当前的工作路径。
示例:获取当前工作路径
# 获取当前工作路径
current_dir <- getwd()
print(current_dir)
getwd() 返回当前 R 会话的完整路径。
1.2 设置工作路径
可以使用 setwd() 函数设置新的工作路径。
示例:设置新的工作路径
# 设置工作路径为 "D:/Data"
setwd("D:/Data")
注意:
使用正斜杠 / 或双反斜杠 \ 作为路径分隔符。
设置成功后,所有文件的读取和保存都将在此路径下进行。
1.3 完整示例
# 获取当前工作路径
current_dir <- getwd()
print(paste("当前工作路径:", current_dir))
# 设置新的工作路径
setwd("D:/Data")
print(paste("新工作路径已设置为:", getwd()))
二、读取文件函数
read.table(file, header = FALSE, sep = "", quote = "\"'", dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
row.names, col.names, as.is = !stringsAsFactors,na.strings = "NA", colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = FALSE,fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
#file 文件路径 #sep 分隔符 #header
第一行是不是列名(如果第一行是列名导入的时候填TRUE;默认值是FALSE,即把第一行算作数据)
注意数据分隔符:
因为数据有时候是从数据库导出或者.xlsx里截取等等,所以有时候看起来是空白分隔却有着不一样的格式。
常见空白分隔符有:空格,制表符,换行符。sep=” ”;sep = “\t”;sep = “\n”
参数 | 类型 | 说明 | 默认值 |
---|---|---|---|
file |
字符串 | 文件路径或连接对象。 | 必须指定 |
header |
逻辑值 | 第一行是否为列名。TRUE 表示第一行是列名,FALSE 表示第一行是数据。 |
FALSE |
sep |
字符 | 字段分隔符,常用的有 "," (逗号)、\t (制表符)。 |
"" (空格) |
quote |
字符 | 用于引用字符的符号,常用为 " 或 ' 。 |
"\"'" |
dec |
字符 | 小数点字符,常用为 . 或 , 。 |
"." |
numerals |
字符向量 | 如何处理数值丢失:"allow.loss" (允许丢失)、"warn.loss" (警告丢失)、"no.loss" (不丢失)。 |
"allow.loss" |
row.names |
数值/字符向量 | 指定行名的数据列,NULL 表示不设置行名。 |
missing |
col.names |
字符向量 | 指定列名,NULL 表示使用默认列名。 |
missing |
as.is |
逻辑值/向量 | TRUE 表示不将字符型变量转换为因子。 |
!stringsAsFactors |
na.strings |
字符向量 | 将哪些字符串识别为 NA 值。 |
"NA" |
colClasses |
字符向量 | 指定各列的数据类型(如 "numeric" 、"character" )。 |
NA |
nrows |
整数 | 读取的最大行数,-1 表示读取所有行。 |
-1 |
skip |
整数 | 跳过的行数(用于跳过文件的前几行)。 | 0 |
check.names |
逻辑值 | 如果为 TRUE ,自动调整列名,使其成为合法的 R 变量名。 |
TRUE |
fill |
逻辑值 | TRUE 表示在行长度不等时自动补充缺失值。 |
!blank.lines.skip |
strip.white |
逻辑值 | 去除字符型变量首尾的空格。 | FALSE |
blank.lines.skip |
逻辑值 | TRUE 表示跳过空行。 |
TRUE |
comment.char |
字符 | 用于注释的字符(例如 # ),设置为空字符 "" 表示不使用注释。 |
"#" |
allowEscapes |
逻辑值 | TRUE 表示允许转义字符(如 \n 、\t )。 |
FALSE |
flush |
逻辑值 | TRUE 表示在读取错误时丢弃当前行的剩余内容。 |
FALSE |
stringsAsFactors |
逻辑值 | TRUE 表示将字符型变量转换为因子。 |
FALSE |
fileEncoding |
字符 | 文件编码格式,如 "UTF-8" 、"GBK" 等。 |
"" |
encoding |
字符 | 指定读取编码方式(通常与 fileEncoding 配合使用)。 |
"unknown" |
text |
字符向量 | 直接从字符向量中读取数据。 | missing |
skipNul |
逻辑值 | TRUE 表示跳过 NULL 字符。 |
FALSE |
三、读取数据文件
比较简单,直接调用函数即可,参数就是 文件的路径,当然还有其它的一些参数,自行试一试就知道了。如果不太清楚有哪些参数的,调用help函数看一下就ok了。当我们读入的是其它的格式文件时也需要加载相应的包。
3.1 读取TXT数据
将工作路径调制要导入文件所在的文件夹下,之后输入.txt的文件名和分隔符就可以导入数据了。
data1 <- read.table('test.txt',sep = '\t',header = TRUE)
data1
3.2 读取CSV文件
data2 <- read.csv('countrylanguage.csv',TRUE)
head(data2,6)
3.3 读取Excel文件
R语言是一个大小写敏感的语言,加载好openxlsx包就可以开始读取Excel文件了。
(1)从剪贴板导入
先打开Excel,选中需要的数据后复制,然后再R中输入以下的指令:data.excel =read.xlsx("clipboard") #clipboard剪贴板
data3 <- read.table("clipboard",header=T)
data3
(2)从Excel文件导入
#install.packages("openxlsx")
library(openxlsx)
dada4<- read.xlsx(file,sheet=1)
data4
3.4 批量读取多个 Excel 文件
批量读取的数据文件往往具有相同的列结构(列名、列类型),读入后紧接着需要按行合并为一个数据框。批量读取并合并,道理很简单,总共分三步:获取批量数据文件的路径;循环机制批量读取;合并成一个数据文件。
library(purrr)
library(readxl)
files = list.files("C:/Users/hao'hai/Documents", pattern = "xlsx",full.names = TRUE, recursive = FALSE) #查找指定路径下的EXCEL文件
#[1] "C:/Users/hao'hai/Documents/hh1.xlsx"
#[2] "C:/Users/hao'hai/Documents/hh2.xlsx"
#[3] "C:/Users/hao'hai/Documents/hh3.xlsx"
df = map_dfr(set_names(files), read_xlsx, .id = " 来源") #合并路径下的EXCEL文件数据为df
df #查看合并数据
# `来源` 年龄 性别 风险 专兼职 职业 教育 结果
# <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#1 C:/Users/hao'hai/Documents/hh~ 30-39 女 无 专职 无业 研究~ 持平
#2 C:/Users/hao'hai/Documents/hh~ 30-39 男 有 兼职 干部 文盲 持平
#3 C:/Users/hao'hai/Documents/hh~ 30-39 男 有 兼职 干部 文盲 持平
四、写入数据文件
4.1 写入函数简介
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ", eol = "\n", na = "NA", dec = ".", row.names = TRUE,col.names = TRUE, qmethod = c("escape", "double"), fileEncoding = "")
可以保存成任意符号分隔的文件write.table(data,file,sep),保存成文件的类型要自己以扩展名的方式写在‘file'字段里,比如test.csv,test.doc,test.xlsx,write.table()和write.csv()就可以完成。比较实用的参数就是列名col.name,行名row.name,以及引号quote,一般我们输出的数据有引号,如果想去除的话把quote设置为F就好。其它格式文件类似。
4.2 写入CSV文件
# 写入文件
data(iris)
write.csv(iris,file = "mydata.csv",row.names = F)
# 读文件
data4<-read.table("mydata.csv",header=T, sep=",")
head(data4)
4.3 写入Excel文件
aa<-data.frame(id = 1:5,y = rnorm(5))
bb<-data.frame(id = 1:7,y = rnorm(7))
# install.packages("openxlsx") #如果没有openxlsx包,运行该命令
library(openxlsx)
sheets = list("我是aa" = aa,"我是bb" = bb)
write.xlsx (sheets,"我是输出结果.xlsx")
总结
R 语言提供了丰富的数据读取功能,支持多种格式的文件,包括文本、CSV、Excel、JSON、XML 和数据库等。根据文件的类型和大小,选择合适的读取方法可以显著提高数据读取的效率。read.table() 和 read.csv() 适合小文件,fread() 适合大文件,而 jsonlite 和 XML 则适合半结构化和非结构化数据。掌握这些方法,可以为后续的数据清洗、分析和建模打下坚实的基础。
参考文献
- (R语言 数据的读写)[https://blog.csdn.net/xiaonanxinyi/article/details/103080589]
- (R语言-如何循环读取excel并保存为RData)[https://www.yht7.com/news/140857]
- (R语言新书】2.2 数据读写)[https://zhuanlan.zhihu.com/p/256284851]