前言

数据集的概念

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

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中第一个到第三个元素。

【从CC#角度看】

  • 向量就是规定类型的一维数组,通过函数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 

【从CC#角度看】

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

数组

数组是矩阵的加强版,它的维度可以大于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)

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

image-20220505211928183

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.


赤脚踩在明媚的沙滩上,我看见了你闪耀的双眼,柔软的头发,我便心有所属