数据文件的读写—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 则适合半结构化和非结构化数据。掌握这些方法,可以为后续的数据清洗、分析和建模打下坚实的基础。


参考文献

  1. (R语言 数据的读写)[https://blog.csdn.net/xiaonanxinyi/article/details/103080589]
  2. (R语言-如何循环读取excel并保存为RData)[https://www.yht7.com/news/140857]
  3. (R语言新书】2.2 数据读写)[https://zhuanlan.zhihu.com/p/256284851]
posted @ 2022-05-04 19:35  郝hai  阅读(804)  评论(0)    收藏  举报