R CSV 文件

R 作为统计学专业工具,如果只能人工的导入和导出数据将使其功能变得没有意义,所以 R 支持批量的从主流的表格存储格式文件(例如 CSV、Excel、XML 等)中获取数据。

CSV 表格交互

CSV(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号) 是一种非常流行的表格存储文件格式,这种格式适合储存中型或小型数据规模的数据。

由于大多数软件支持这个文件格式,所以常用于数据的储存与交互。

CSV 本质是文本,它的文件格式极度简单:数据一行一行的用文本保存起来而已,每条记录被分隔符分隔为字段,每条记录都有同样的字段序列。

以下是一个简单的 sites.csv 文件(存储在测试程序的相同目录下):

1
2
3
4
5
id,name,url,likes
1,Google,www.google.com,111
2,Runoob,www.runoob.com,222
3,Taobao,www.taobao.com,333

CSV 用逗号来分割列,如果数据中含有逗号,就要用双引号将整个数据块包括起来。

**注意:**包含非英文字符的文本要注意保存的编码,由于很多计算机普遍使用 UTF-8 编码,所以我是用 UTF-8 进行保存的。

注意: CSV 文件最后一行需要保留一个空行,不然执行程序会有警告信息。

1
2
3
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote, :
incomplete final line found by readTableHeader on 'sites.csv'

读取 CSV 文件

接下来我们就可以使用 read.csv() 函数来读取 CSV 文件的数据:

实例

1
2
data <- read.csv("sites.csv", encoding\="UTF-8")  
print(data)

如果不设置 encoding 属性,read.csv 函数将默认以操作系统默认的文字编码进行读取,如果你使用的是 Windows 中文版系统且没有设置过系统的默认编码,那系统的默认编码应该是 GBK。所以大家请尽可能地统一文字编码以防出错。

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

read.csv() 函数返回的是数据框,我们可以很方便的对数据进行统计处理,以下实例我们查看行数和列数:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

print(is.data.frame(data))  \# 查看是否是数据框
print(ncol(data))  \# 列数
print(nrow(data))  \# 行数

执行以上代码输出结果为:

1
2
3
[1] TRUE
[1] 4
[1] 3

以下统计数据框中 likes 字段最大对数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 最大的数据
like <- max(data$likes)
print(like)

执行以上代码输出结果为:

1
[1] 333

我们也可以指定查找条件,类似 SQL where 子句一样查询数据,需要用到到函数是 subset()

以下实例查找 likes 为 222 到数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)
print(retval)

执行以上代码输出结果为:

1
2
  id   name            url likes
2 2 Runoob www.runoob.com 222

注意:条件语句等于使用 ==。

多个条件使用 & 分隔符,以下实例查找 likes 大于 1 name 为 Runoob 的数据:

实例

1
2
3
4
5
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 大于 1 name 为 Runoob 的数据
retval <- subset(data, likes \> 1 & name\=="Runoob")
print(retval)

执行以上代码输出结果为:

1
2
  id   name            url likes
2 2 Runoob www.runoob.com 222

保存为 CSV 文件

R 语言可以使用 write.csv() 函数将数据保存为 CSV 文件。

接着以上实例,我们将 likes 为 222 的数据 保存到 runoob.csv 文件:

实例

1
2
3
4
5
6
7
8
9
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)

\# 写入新的文件
write.csv(retval,"runoob.csv")
newdata <- read.csv("runoob.csv")
print(newdata)

执行以上代码输出结果为:

1
2
 X id   name            url likes
1 2 2 Runoob www.runoob.com 222

X 来自数据集 newper,可以通过参数 row.names = FALSE 来删除它:

实例

1
2
3
4
5
6
7
8
9
data <- read.csv("sites.csv", encoding\="UTF-8")

\# likes 为 222 的数据
retval <- subset(data, likes \== 222)

\# 写入新的文件
write.csv(retval,"runoob.csv", row.names \= FALSE)
newdata <- read.csv("runoob.csv")
print(newdata)

执行以上代码输出结果为:

1
2
  id   name            url likes
1 2 Runoob www.runoob.com 222

执行完后,我们就可以看到 runoob.csv 文件生存:

R Excel 文件

Excel 格式的文件主要是 xls 或 xlsx,这两种文件可以在 R 语言中导入 xlsx 库来实现直接的读取。

R 语言读写 Excel 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("xlsx", repos = "https://mirrors.ustc.edu.cn/CRAN/")

安装过程如下:

事实上,几乎所有的 Excel 软件与大多数表格软件一样支持 CSV 格式的数据,所以完全可以通过 CSV 与 R 交互,没必要再使用 Excel。

查看 xlsx 是否安装成功:

实例

1
2
3
4
5
\# 验证包是否安装  
any(grepl("xlsx",installed.packages()))
\# 载入包
library("xlsx")
library("xlsx")

执行以上代码输出结果为:

1
2
3
4
[1] TRUE
Loading required package: rJava
Loading required package: methods
Loading required package: xlsxjars

Excel 文件数据:

点击链接下载 Excel 测试数据:https://static.jyshare.com/download/sites.xlsx

接下来,我们可以使用 read.xlsx() 函数来读取 Excel 数据:

实例

1
2
3
\# 读取 sites.xlsx 第一个工作表数据  
data <- read.xlsx("sites.xlsx", sheetIndex \= 1)
print(data)

R XML 文件

XML 指的是可扩展标记语言(eXtensible Markup Language),XML 被设计用来传输和存储数据。

如果你对 XML 还不了解,可以先查阅:XML 教程

R 语言读写 XML 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("XML", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("XML",installed.packages()))
[1] TRUE

创建 sites.xml 文件,xml 文件与测试脚本同一目录下,代码如下:

实例

1
<sites\> <site\> <id\>1</id\> <name\>Google</name\> <url\>www.google.com</url\> <likes\>111</likes\> </site\> <site\> <id\>2</id\> <name\>Runoob</name\> <url\>www.runoob.com</url\> <likes\>222</likes\> </site\> <site\> <id\>3</id\> <name\>Taobao</name\> <url\>www.taobao.com</url\> <likes\>333</likes\> </site\> </sites\>

接下来我们可以使用 XML 包来载入 xml 文件的数据:

实例

1
2
3
4
5
6
7
8
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 输出结果
print(result)

统计 xml 数据量:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 提取根节点
rootnode <- xmlRoot(result)

\# 统计数据量
rootsize <- xmlSize(rootnode)

\# 输出结果
print(rootsize)

执行以上代码输出结果为:

1
[1] 3

查看节点数据,某一行使用 [ ], 指定的行和列使用 [[ ]]:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 提取根节点
rootnode <- xmlRoot(result)

\# 查看第 2 个节点数据
print(rootnode\[2\])

\# 查看第 2 个节点的第  1 个数据
print(rootnode\[\[2\]\]\[\[1\]\])

\# 查看第 2 个节点的第 3 个数据

print(rootnode\[\[2\]\]\[\[3\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
$site
<site>
<id>2</id>
<name>Runoob</name>
<url>www.runoob.com</url>
<likes>222</likes>
</site>

attr(,"class")
[1] "XMLInternalNodeList" "XMLNodeList"
<id>2</id>
<url>www.runoob.com</url>

XML 转为数据列表

以上代码对输出都是 xml 格式,我们使用 xmlToList() 函数可以将文件对数据转为列表格式,更方便读取:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
\# 载入 XML 包  
library("XML")

\# 设置文件名
result <- xmlParse(file \= "sites.xml")

\# 转为列表
xml\_data <- xmlToList(result)

print(xml\_data)
print("============================")

\# 输出第一行第二列的数据
print(xml\_data\[\[1\]\]\[\[2\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$site
$site$id
[1] "1"

$site$name
[1] "Google"

$site$url
[1] "www.google.com"

$site$likes
[1] "111"


$site
$site$id
[1] "2"

$site$name
[1] "Runoob"

$site$url
[1] "www.runoob.com"

$site$likes
[1] "222"


$site
$site$id
[1] "3"

$site$name
[1] "Taobao"

$site$url
[1] "www.taobao.com"

$site$likes
[1] "333"


[1] "============================"
[1] "Google"

XML 转为数据框

XML 文件数据可以转为数据框类型,这样我们就更方便对数据进行操作:

实例

1
2
3
4
5
6
\# 载入 XML 包  
library("XML")

\# xml 文件数据转为数据框
xmldataframe <- xmlToDataFrame("sites.xml")
print(xmldataframe)

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

R JSON 文件

JSON: JavaScript Object Notation(JavaScript 对象表示法)。

JSON 是存储和交换文本信息的语法。

JSON 类似 XML,但比 XML 更小、更快,更易解析。

如果你对 JSON 还不了解,可以先查阅:JSON 教程

R 语言读写 JSON 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("rjson", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("rjson",installed.packages()))
[1] TRUE

创建 sites.json 文件,json 文件与测试脚本同一目录下,代码如下:

实例

1
{ "id":\["1","2","3"\], "name":\["Google","Runoob","Taobao"\], "url":\["www.google.com","www.runoob.com","www.taobao.com"\], "likes":\[ 111,222,333\] }

接下来我们可以使用 rjson 包来载入 json 文件的数据。

查看数据,某一行使用 [ ], 指定的行和列使用 [[ ]]:

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\# 载入 rjson 包  
library("rjson")

\# 获取 json 数据
result <- fromJSON(file \= "sites.json")

\# 输出结果
print(result)

print("===============")

\# 输出第 1 列的结果
print(result\[1\])

print("===============")
\# 输出第 2 行第 2 列的结果
print(result\[\[2\]\]\[\[2\]\])

执行以上代码输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$id
[1] "1" "2" "3"

$name
[1] "Google" "Runoob" "Taobao"

$url
[1] "www.google.com" "www.runoob.com" "www.taobao.com"

$likes
[1] 111 222 333

[1] "==============="
$id
[1] "1" "2" "3"

[1] "==============="
[1] "Runoob"

我们也可以使用 as.data.frame() 函数将 json 文件数据可以转为数据框类型,这样我们就更方便对数据进行操作:

实例

1
2
3
4
5
6
7
8
9
10
\# 载入 rjson 包  
library("rjson")

\# 获取 json 数据
result <- fromJSON(file \= "sites.json")

\# 转为数据框
json\_data\_frame <- as.data.frame(result)

print(json\_data\_frame)

执行以上代码输出结果为:

1
2
3
4
  id   name            url likes
1 1 Google www.google.com 111
2 2 Runoob www.runoob.com 222
3 3 Taobao www.taobao.com 333

R MySQL 连接

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

如果你对 MySQL 还不了解,可以先查阅:MySQL 教程

R 语言读写 MySQL 文件需要安装扩展包,我们可以在 R 到控制台输入以下命令来安装:

1
install.packages("RMySQL", repos = "https://mirrors.ustc.edu.cn/CRAN/")

查看是否安装成功:

1
2
> any(grepl("RMySQL",installed.packages()))
[1] TRUE

MySQL 目前被甲骨文收购,所以很多人使用来它的复制版本 MariaDB,MariaDB 在 GNU GPL下开源,MariaDB 的开发是由 MySQL 的一些原始开发者领导的,所以语法操作都差不多:

1
install.packages("RMariaDB", repos = "https://mirrors.ustc.edu.cn/CRAN/")

在 test 数据库中创建数据表 runoob,表结构及数据代码如下:

实例

1
\-- -- 表的结构 \`runoob\` \-- CREATE TABLE \`runoob\` ( \`id\` int(11) NOT NULL, \`name\` char(20) NOT NULL, \`url\` varchar(255) NOT NULL, \`likes\` int(11) NOT NULL ) ENGINE\=InnoDB DEFAULT CHARSET\=utf8mb4; \-- -- 转存表中的数据 \`runoob\` \-- INSERT INTO \`runoob\` (\`id\`, \`name\`, \`url\`, \`likes\`) VALUES (1, 'Google', 'www.google.com', 111), (2, 'Runoob', 'www.runoob.com', 222), (3, 'Taobao', 'www.taobao.com', 333);

接下来我们可以使用 RMySQL 包来读取数据:

实例

1
2
3
4
5
6
7
library(RMySQL)

\# dbname 为数据库名,这边的参数请根据自己实际情况填写
mysqlconnection \= dbConnect(MySQL(), user \= 'root', password \= '', dbname \= 'test',host \= 'localhost')

\# 查看数据
dbListTables(mysqlconnection)

接下来我们可以使用 dbSendQuery 来读取数据库的表,结果集通过 fetch() 函数来获取:

实例

1
2
3
4
5
6
7
library(RMySQL)  
\# 查询 sites 表,增删改查操作可以通过第二个参数的 SQL 语句来实现
result \= dbSendQuery(mysqlconnection, "select \* from sites")

\# 获取前面两行数据
data.frame \= fetch(result, n \= 2)
print(data.frame)