前言
数据集的概念
数据集是由数据构成的矩形数组,行表示观测(记录),列表示变量(字段)。
R
有许多用于存储数据的结构,包括标量,向量,数组,数据框和列表。
R
可以处理的数据类型包括数值型,字符型,逻辑型,复数型和原生型。
数据结构
向量
向量是用于存储数据的一维数组。
创建向量
利用c()
可以用来创建向量。
a <- c(1,2,3,4)
a <- c("你好","世界")
注:单个向量之内的数据类型需要相同。一个向量不可以混合多种数据类型
访问向量元素
通过指定向量中元素的位置来访问元素,例如:
a[c(1)]
来表示指定访问向量a
中第一个元素。a[c(1,3)]
来表示指定访问向量a
中第一个和第三个元素。a[c(1:3)]
来表示访问向量a
中第一个到第三个元素。
【从C
和C#
角度看】
- 向量就是规定类型的一维数组,通过函数
c(数据内容,间隔采用,号)
来创建。 - 访问数组中元素通过下标来访问,使用函数
向量变量[c(下标位置)]
需要注意的是:
R
语言的数字是从1开始的,而不是0.
矩阵
矩阵是一个二维数组。
创建矩阵
通过函数matrix
来创建。函数源码如下:
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
代码示例:
> # 创建一个矩阵,按列填充
> 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
表示列数。代码示例:
> # 创建一个矩阵,按行填充,并重命名
> 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
【从C
和C#
角度看】
- 矩阵是已经嵌套好的二维数组,更加偏向于数学上的线性代数。
数组
数组是矩阵的加强版,它的维度可以大于2。
创建数组
通过函数array
创建,函数原型示例:
array(data = NA, dim = length(data), dimnames = NULL)
- data:数组的数据
- dim:数组的长度,
c(行数,列数,维度)
- dimnames:(
List
类型)数组行列维度名称
代码示例:
> # 创建一个一维数组
> 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
数组元素的访问
同上,使用元素位置来访问,代码示例
> # 创建一个一维数组
> a <- c(1:24)
> c <- array(a,c(2,3,4))
> # 访问数组第二层第二行第二列元素
> c[2,2,2]
[1] 10
数据框
数据框类似于Excel,是一种键值对的格式,它可以混合使用多种数据类型。
创建数据框
通过使用函数data.frame()
,函数原型如下:
data.frame(..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = FALSE)
- ...:数据内容
- row.names:行名称
代码示例:
> # 创建一个数据框
> name <- c('小明','小亮','小亮')
> classNum <- c('林学一班','林学二班','林学三班')
> rname <- c('第一行','第二行','第三行')
> a <- data.frame(name,classNum,row.names = rname)
> a
name classNum
第一行 小明 林学一班
第二行 小亮 林学二班
第三行 小亮 林学三班
数据框元素的访问
可以通过元素位置索引来访问,数据框名称[第几列]
,表示访问第几列元素。数据框名称[第几行,第几列]
或者如果想要表现其中两个数据关系,可以通过table(数据框名称$列/行名称)
来实现。代码示例:
> # 创建一个数据框
> 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()
来简化代码。
或者使用$
来访问元素。代码示例:
> # 创建一个数据框
> 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()
来创建,函数原型:
list(...);
当然你也可以给列表中的参数命名,如下:
list(name1=object1,....)
数据的输入
R
可以从键盘,文本文件,Excel和Access,流行的统计软件,特殊格式的文件以及多种关系数据库导入数据。
关于向R中导入数据的权威指南参见R Data Import/Export手册
使用键盘输入数据
使用edit()
函数调用产生一个输入数据的文本框,输入数据即可完成键入数据。代码示例:
# 创建一个数据框
a <- data.frame(name=character(0),classNum=character(0),Num=numeric(0))
# 键入数据框内容
a <- edit(a)
# 打印数据框内容
print(a)
弹出输入数据的文本框样式:

character(0)
是空字符型创建,numeric(0)
是空数值型,logical(0)
是空逻辑型
从带分隔符的文本文件导入数据
即从常规的TXT
文本中读取数据,需要注意的是该文件需要是ASCII
编码的文件。
关于如何查看
TXT
文件是否是ASCII
编码以及如何转换成ASCII
编码的文件请自行百度
读取需要使用read.table()
函数,函数原型如下:
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
:自定义列名称
文件路径如果提供的是相对路径,则需要将文件放在工作目录下,如果是绝对路径则不需要,绝对路径使用正斜杠。
文本文件内容如下,第一行为列名称,数据通过|
分割。
姓名|班级
小明|林学一班
小张|林学二班
小亮|林学三班
需要注意的是在Win中,
TXT
文件最后需要以回车结尾,至于为什么可以参考CRLF和LF的差异
代码示例:
# 读取文本文件内容
> 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
包:
install.packages('RODBC')
使用该包读取Excel文件,Excel文件内容如下:
姓名 班级 学号
小明 林学一班 123
小亮 林学二班 321
小张 林学三班 345
代码示例:
# 载入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()
函数。函数原型:
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
:文件中第几个表的索引
代码示例:
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) | 关闭数据库的连接 |
该包提供的是面向数据库的双向通路,既可以读取数据库也可以写入数据库。
关于该包的更多更详细的用法,自行查看包的相关说明。
Q.E.D.