R语言基础(一):注释、变量
R语言基础(二):常用函数
R语言基础(三):运算
R语言基础(四):数据类型
R语言基础(五):流程控制语句
R语言基础(六):函数
8. 文件处理
8.1 csv文件
csv文件是一种简单的文本文件,它有行列形式,但不像Excel那么复杂,csv文件是一个纯文本文件,但可以当做表格使用,列与列之间用英文逗号隔开。创建一个name.csv文件
姓名,性别,年龄
张三,男,20
李四,女,19
王五,男,25
8.1.1 读取csv
使用R读取csv文件:
> setwd("D:/") #设置当前目录
> data <- read.csv("name.csv") #读取文件,如果有中文会乱乱码
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, :
incomplete final line found by readTableHeader on 'name.csv'
> data
濮撳悕 鎬у埆 骞撮緞
1 寮犱笁 鐢<b7>,20 NA
2 鏉庡洓 濂<b3>,19 NA
3 鐜嬩簲 鐢<b7>,25 NA
#加上encoding解决中文乱码问题,在文件末尾加一个空行消除Warning message
> data <- read.csv("name.csv", encoding = 'UTF-8')
> data
姓名 性别 年龄
1 张三 男 20
2 李四 女 19
3 王五 男 25
>
读取csv的结果data是一个数据帧data frame类型,对数据帧所有的操作都适用
> str(data)
'data.frame': 3 obs. of 3 variables:
$ 姓名: chr "张三" "李四" "王五"
$ 性别: chr "男" "女" "男"
$ 年龄: int 20 19 25
> age <- age(data$年龄) #最大年龄
> age
[1] 25
8.1.2 写入csv
用write.csv()写入文件
> data <- read.csv("name.csv", encoding = 'UTF-8')
#创建一个新行
> newrow = data.frame(
姓名 = c("小明"),
性别 = c("男"),
年龄 = c(19)
)
#在原来数据帧中写一行
> data = rbind(data,newrow)
> data
姓名 性别 年龄
1 张三 男 20
2 李四 女 19
3 王五 男 25
4 小明 男 19
#保存文件row.names = FALSE去掉前面的1234
> write.csv(data,"new.csv", row.names = FALSE)
保存后的文件:
"姓名","性别","年龄"
"张三","男",20
"李四","女",19
"王五","男",25
"小明","男",19
8.2 Excel文件
安装依赖包
> any(grepl("xlsx",installed.packages())) #验证是否安装
[1] FALSE #没安装
> install.packages("xlsx") #开始安装
--- 在此連線階段时请选用CRAN的鏡子 ---
还安装相依关系‘rJava’, ‘xlsxjars’
> library("xlsx") #加载软件包
准备一个excel文件,data.xlsx
月份 | 交通费 | 办公损耗 | 人力成本 | 结算日期 |
---|---|---|---|---|
1月 | 17.84 | 54.18 | 27.98 | 2020/1/31 |
2月 | 18.21 | 35.1 | 46.69 | 2020/2/28 |
3月 | 46.63 | 18.12 | 35.25 | 2020/3/31 |
4月 | 35.89 | 48.57 | 15.54 | 2020/4/29 |
5月 | 47.01 | 3.42 | 49.57 | 2020/5/30 |
6月 | 36.83 | 1.42 | 61.75 | 2020/6/30 |
7月 | 8.71 | 43.55 | 47.74 | 2020/7/31 |
8.2.1 读取excel
读取Excel的时候如果有中文需要加encoding参数,否则会报错:
> data = read.xlsx("D:/data.xlsx",sheetIndex=1) #中文要加encoding
Error in make.names(vnames, unique = TRUE) : 多字节字符串3有错
> data = read.xlsx("D:/data.xlsx",sheetIndex=1,encoding = "UTF-8")
> data
月份 交通费 办公损耗 人力成本 结算日期
1 1月 17.84 54.18 27.98 2020-01-31
2 2月 18.21 35.10 46.69 2020-02-28
3 3月 46.63 18.12 35.25 2020-03-31
4 4月 35.89 48.57 15.54 2020-04-29
5 5月 47.01 3.42 49.57 2020-05-30
6 6月 36.83 1.42 61.75 2020-06-30
7 7月 8.71 43.55 47.74 2020-07-31
8.2.2 写入excel
> newrow = data.frame(
月份 = c("8月"),
交通费 = c(10),
办公损耗 = c(20),
人力成本 = c(30),
结算日期 = c('2020-08-30')
)
> data = rbind(data,newrow) #加入一行
> write.xlsx(data,"new.xlsx", row.names = FALSE) #写新文件
#在原文件追加一个sheet
> write.xlsx2(data,"data.xlsx", row.names = FALSE,append=TRUE,sheetName="Sheet2")
>
8.3 XML文件
安装xml依赖的包
> install.packages("XML")
> library("XML")
准备xml文件user.xml
<users>
<user>
<id>1</id>
<name>张三</name>
</user>
<user>
<id>2</id>
<name>李四</name>
</user>
</users>
8.3.1 读取xml文件
#加载xml
> data = xmlParse(file="user.xml")
#提取根节点
> root=xmlRoot(data)
#获取子节点个数
> xmlSize(root)
[1] 2
#读取第一个节点
> root[1]
$user
<user>
<id>1</id>
<name>张三</name>
</user>
#读取第一个节点的第二个属性
> root[[1]][[2]]
<name>张三</name>
#将数据转成list
> list_data <- xmlToList(data)
#将数据转成data frame
> data=xmlToDataFrame("user.xml")
> data
id name
1 1 张三
2 2 李四
8.3.2 写入xml
安装依赖包
> install.packages("Runiversal")
> library(Runiversal)
#写入
cat(makexml(data),file = "options.xml")
8.4 JSON文件
JSON全名是JavaScript Object Notation(JavaScript 对象表示法)。现在JSON不只局限在JavaScript中,各种编程语言都对JSON提供了支持,JSON也是网络传输中很重要的一种格式。可以把JSON理解为符合一定格式的字符串。
JSON是以key-value形式存储的数据,大括号
{}
用于包裹对象,中括号[]
用于包裹集合(类似于list和array的数据)。key就是属性名,可以用引号包裹,value就是属性值,String类型的值用引号包裹,key和value之间用英文冒号:
隔开。
准备数据data.json
{
"name" : ["张三","李四","王五"],
"age" : [20,25,28]
}
安装JSON包
> install.packages("rjson")
> library("rjson")
> json=fromJSON(file="data.json")
> data=data.frame(json)
> data
name age
1 张三 20
2 李四 25
3 王五 28
>
也可以使用另一个包,支持更好一些
> install.packages("jsonlite")
> library(jsonlite) #注意切换包
> data=fromJSON("data.json")
#数据转换成json
> json=toJSON(data,pretty=TRUE)
#写入文件
> cat(json, file = (con <- file('n.json', "w", encoding = "UTF-8")))
> close(con)
8.5 MySQL数据库
MySQL是一种常用的非关系型数据库。
在test库中准备数据表dept
id name
------ -----------
1 技术部
2 测试部
3 商务部
4 运营部
5 财务部
6 拓展部
#安装库
> install.packages("RMySQL")
> library(RMySQL)
> conn = dbConnect(MySQL(), user = 'xx', password = 'xx', dbname = 'xx',host = 'localhost')
> dbSendQuery(conn,'SET NAMES gbk') #解决中文乱码
> result = dbSendQuery(conn, "select * from dept") #查询
> data=fetch(result, n = 2) #取结果集前两条
> dbClearResult(result) #关闭结果集
#添加数据
> dbSendQuery(conn,"insert into dept(name) values('行政部')")
> dbDisconnect(conn) #关闭连接