前言

数据集的概念

数据集是由数据构成的矩形数组,行表示观测(记录),列表示变量(字段)。

R有许多用于存储数据的结构,包括标量,向量,数组,数据框和列表

R可以处理的数据类型包括数值型,字符型,逻辑型,复数型和原生型

数据结构

向量

向量是用于存储数据的一维数组

创建向量

利用c()可以用来创建向量

1
2
a <- c(1,2,3,4)
a <- c("你好","世界")

注:单个向量之内的数据类型需要相同。一个向量不可以混合多种数据类型

访问向量元素

通过指定向量中元素的位置来访问元素,例如:

  • a[c(1)]来表示指定访问向量a中第一个元素。
  • a[c(1,3)]来表示指定访问向量a中第一个和第三个元素。
  • a[c(1:3)]来表示访问向量a中第一个到第三个元素。

【从CC#角度看】

  • 向量就是规定类型的一维数组,通过函数c(数据内容,间隔采用,号)来创建。
  • 访问数组中元素通过下标来访问,使用函数向量变量[c(下标位置)]

需要注意的是:**R语言的数字是从1开始的,而不是0.**

矩阵

矩阵是一个二维数组。

创建矩阵

通过函数matrix来创建。函数源码如下:

1
2
3
4
5
6
7
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
{
if (is.object(data) || !is.atomic(data))
data <- as.vector(data)
.Internal(matrix(data, nrow, ncol, byrow, dimnames, missing(nrow),
missing(ncol)))
}
  • data:二维数组数据内容
  • nrow:(数值)行数,默认1
  • ncol:(数值)列数,默认1
  • byrow:(布尔)填充数值是从列开始还是从行开始,FLASE默认值,表示从列开始填充
  • dimnames:(两个参数的list)行列名称重命名,默认NULL

代码示例:

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
> # 创建一个矩阵,按列填充
> a <- matrix(1:20,4,5)
> print(a)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20


> # 创建一个矩阵,按行填充
> a <- matrix(1:20,4,5,TRUE)
> print(a)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20


> # 创建一个矩阵,按行填充,并重命名
> rname <- c("第一行",'第二行','第三行','第四行')
> cname <- c("第一列",'第二列','第三列','第四列','第五列')
> a <- matrix(1:20,4,5,TRUE,list(rname,cname))
> print(a)
第一列 第二列 第三列 第四列 第五列
第一行 1 2 3 4 5
第二行 6 7 8 9 10
第三行 11 12 13 14 15
第四行 16 17 18 19 20

访问矩阵元素

同理也是通过矩阵下标来表示位置矩阵名称[x,y]x表示行数,y表示列数。代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
> # 创建一个矩阵,按行填充,并重命名
> rname <- c("第一行",'第二行','第三行','第四行')
> cname <- c("第一列",'第二列','第三列','第四列','第五列')
> a <- matrix(1:20,4,5,TRUE,list(rname,cname))

> # 访问第二行元素
> a[2,]
第一列 第二列 第三列 第四列 第五列
6 7 8 9 10

> # 访问第二行第三个元素
> a[2,3]
[1] 8

> # 访问第二行第三,四个元素
> a[2,3:4]
第三列 第四列
8 9

> a[2,c(3,4)]
第三列 第四列
8 9

【从CC#角度看】

  • 矩阵是已经嵌套好的二维数组,更加偏向于数学上的线性代数。

数组

数组是矩阵的加强版,它的维度可以大于2

创建数组

通过函数array创建,函数原型示例:

1
array(data = NA, dim = length(data), dimnames = NULL)
  • data:数组的数据
  • dim:数组的长度,c(行数,列数,维度)
  • dimnames:(List类型)数组行列维度名称

代码示例:

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
> # 创建一个一维数组
> name1 <- c('第一行','第二列')
> name2 <- c('第一列','第二列','第三列')
> name3 <- c('第一层','第二层','第三层','第四层')
> a <- c(1:24)
> c <- array(a,c(2,3,4),list(name1,name2,name3))
> c
, , 第一层

第一列 第二列 第三列
第一行 1 3 5
第二列 2 4 6

, , 第二层

第一列 第二列 第三列
第一行 7 9 11
第二列 8 10 12

, , 第三层

第一列 第二列 第三列
第一行 13 15 17
第二列 14 16 18

, , 第四层

第一列 第二列 第三列
第一行 19 21 23
第二列 20 22 24

数组元素的访问

同上,使用元素位置来访问,代码示例

1
2
3
4
5
6
> # 创建一个一维数组
> a <- c(1:24)
> c <- array(a,c(2,3,4))
> # 访问数组第二层第二行第二列元素
> c[2,2,2]
[1] 10

数据框

数据框类似于Excel,是一种键值对的格式,它可以混合使用多种数据类型

创建数据框

通过**使用函数data.frame()**,函数原型如下:

1
2
3
data.frame(..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = FALSE)
  • …:数据内容
  • row.names:行名称

代码示例:

1
2
3
4
5
6
7
8
9
10
> # 创建一个数据框
> name <- c('小明','小亮','小亮')
> classNum <- c('林学一班','林学二班','林学三班')
> rname <- c('第一行','第二行','第三行')
> a <- data.frame(name,classNum,row.names = rname)
> a
name classNum
第一行 小明 林学一班
第二行 小亮 林学二班
第三行 小亮 林学三班

数据框元素的访问

可以通过元素位置索引来访问,**数据框名称[第几列],表示访问第几列元素。数据框名称[第几行,第几列]或者**如果想要表现其中两个数据关系,可以通过table(数据框名称$列/行名称)来实现。代码示例:

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
> # 创建一个数据框
> name <- c('小明','小亮','小亮')

> classNum <- c('林学一班','林学二班','林学三班')

> rname <- c('第一行','第二行','第三行')

> a <- data.frame(name,classNum,row.names = rname)

> # 访问第一列数据
> a[1]
name
第一行 小明
第二行 小亮
第三行 小亮

> # 访问第一行第1,2个数据
> a[1,1:2]
name classNum
第一行 小明 林学一班

> # 获取行列数据的关系
> table(a$classNum,a$name)

小亮 小明
林学二班 1 0
林学三班 1 0
林学一班 0 1

我们在每次访问变量元素的时候,都需要输入数据框名称$列/行名称,会比较繁琐,可以通过使用函数attach()detach()或者单独使用函数with()来简化代码

或者使用$来访问元素。代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
> # 创建一个数据框
> name <- c('小明','小亮','小亮')
> classNum <- c('林学一班','林学二班','林学三班')
> rname <- c('第一行','第二行','第三行')
> a <- data.frame(name,classNum,row.names = rname)

> # 访问name列
> a$name
[1] "小明" "小亮" "小亮"

> # 访问name列的第二个元素
> a$name[2]
[1] "小亮"

因子

暂欠

通过函数factor来创建.

列表

列表也是一种一维数组,它可以嵌套多种数据类型

创建列表

使用函数list()来创建,函数原型:

1
list(...);

当然你也可以给列表中的参数命名,如下:

1
list(name1=object1,....)

数据的输入

R可以从键盘,文本文件,Excel和Access,流行的统计软件,特殊格式的文件以及多种关系数据库导入数据。

关于向R中导入数据的权威指南参见R Data Import/Export手册

使用键盘输入数据

使用edit()函数调用产生一个输入数据的文本框,输入数据即可完成键入数据。代码示例:

1
2
3
4
5
6
# 创建一个数据框
a <- data.frame(name=character(0),classNum=character(0),Num=numeric(0))
# 键入数据框内容
a <- edit(a)
# 打印数据框内容
print(a)

弹出输入数据的文本框样式:

image-20220505211928183

character(0)是空字符型创建,numeric(0)是空数值型,logical(0)是空逻辑型

从带分隔符的文本文件导入数据

即从常规的TXT文本中读取数据,需要注意的是该文件需要是ASCII编码的文件

关于如何查看TXT文件是否是ASCII编码以及如何转换成ASCII编码的文件请自行百度

读取需要使用read.table()函数,函数原型如下:

1
2
3
4
5
6
7
8
9
10
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:即文件路径
  • header:(布尔值)即文件开头的是否是变量而不是数据
  • sep:自定义数据分隔符,默认为空格
  • row.names:自定义行名称
  • col.names:自定义列名称

文件路径如果提供的是相对路径,则需要将文件放在工作目录下,如果是绝对路径则不需要,绝对路径使用正斜杠

文本文件内容如下,第一行为列名称,数据通过|分割。

1
2
3
4
5
姓名|班级
小明|林学一班
小张|林学二班
小亮|林学三班

需要注意的是在Win中,TXT文件最后需要以回车结尾,至于为什么可以参考CRLF和LF的差异

代码示例:

1
2
3
4
5
6
7
8
# 读取文本文件内容
> a <- read.table('D:/DATA/R/test.txt',header = TRUE,sep = '|',row.names = c('第一行','第二行','第三行') )

> a
姓名 班级
第一行 小明 林学一班
第二行 小张 林学二班
第三行 小亮 林学三班

导入Excel数据

读取Excel最好的方式是将Excel导出为csv文件(逗号分隔文件),然后使用前面的读取文本来读取

使用R包读取Excel数据

在Windows系统中,可以使用RODBC包来访问Excel文件。电子表格第一行应当包含变量/列的名称

首先,下载安装RODBC

1
install.packages('RODBC')

使用该包读取Excel文件,Excel文件内容如下:

1
2
3
4
姓名     班级 学号
小明 林学一班 123
小亮 林学二班 321
小张 林学三班 345

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 载入RODBC包
library(RODBC)
# 打开链接
A <- odbcConnectExcel2007('test.xlsx') # 注:如果你的电脑是32位的使用方法odbcConnectExcel('test.xlsx')
# 读取数据
a <- sqlFetch(A,'Sheet1')
# 关闭链接
odbcClose(A)
# 输出数据
a

姓名 班级 学号
1 小明 林学一班 123
2 小亮 林学二班 321
3 小张 林学三班 345
  • A <- odbcConnectExcel2007('test.xlsx'):A是打开Excel的一个链接通路,传入参数为Excel文件路径
  • a <- sqlFetch(A,'Sheet1'):第一个参数传入打开的通路,第二个参数是表示第几个表

如果你在library(RODBC)的时候报需要更高版本R的支持,可以选择手动导入旧版本包或者更新R版本

当然,如果觉得上述繁琐,有一个最简单的方法,使用xlsx宏包中的 read.xlsx()函数。函数原型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
read.xlsx(
file,
sheetIndex,
sheetName = NULL,
rowIndex = NULL,
startRow = NULL,
endRow = NULL,
colIndex = NULL,
as.data.frame = TRUE,
header = TRUE,
colClasses = NA,
keepFormulas = FALSE,
encoding = "unknown",
password = NULL,
...
)
  • file:文件路径
  • sheetIndex:文件中第几个表的索引

代码示例:

1
2
3
library(xlsx)
a <- read.xlsx('test.xlsx',1)
a

从剪切板上读取Excel数据

通过将要输入的内容复制到剪切板,然后读取剪切板的内容来输入数据。

通过read.delim('clipboard')函数来实现

在运行该函数之前,务必先复制正确的数据内容

从网页抓取数据

暂欠

从XML中导入数据

暂欠

访问数据框系统

如果写过程序的小伙伴可能会很熟悉这里,使用RODBC包提供的接口来链接数据库,该方法几乎可以连接市面上所有数据库系统。包中相关函数说明如下:

注:在使用RODBC包访问数据库之前,需要根据自己的电脑下载相关的ODBC驱动。

函数 说明
odbcConnect(dsn,uid="",pwd="") 建立数据库的连接
sqlFetch(channel,sqltable) 读取数据库中的某个表到一个数据框中
sqlQuery(channel,query) 向数据框提交查询并返回一个结果
sqlSave(channel,mydf,tablename="",append=FALSE) 将数据框写入或者更新(append=True)到数据库中的某个表
sqlDrop(channel,sqtable) 删除数据库中的某个表
close(channel) 关闭数据库的连接

该包提供的是面向数据库的双向通路,既可以读取数据库也可以写入数据库。

关于该包的更多更详细的用法,自行查看包的相关说明。