上一章我们了解了R语言的基本数据结构和语法,但实际运用中所需的变换远不止如此,这节专门介绍几个数据结构的基础操作。

一、向量

0.向量基本操作

向量的索引

x<-c(2,3,4,5)
x[c(2,4)]

这里取了向量的第2和第4给元素

[1] 3 5

向量的组合

x<-c(2,3,4,5)
y<-c(7,8,9,10)
z<-c(x,y)
z

将向量x和y组合

[1]  2  3  4  5  7  8  9 10

a. 向量运算

向量的加减乘除:

x<-c(2,3,4,5)
x+1

向量相加,输出为

x
[1] 3 4 5 6

向量相乘,输入

x<-c(2,3,4,5)
X*2

输出为

x
[1]468 10

向量相除,输入

x<-c(2,3,4,5)
x/3

输出为

x
[1]0.6666667 1.0000000 1.3333333 1.6666667

输入

x<-c(1,2,3,4)
y<-c(1,1,1,1)
x+y

两个变量相加,输出为

[1] 2 3 4 5

b. 快速生成有序向量(函数seqrep

在需要大量有序数值向量时,为了避免手工输入的麻烦,R语言提供了快速生成的方法。如:

输入

x<-1:10

x

输出为

[1]  1  2  3  4  5  6  7  8  9 10

输入

x<-10:1

x

输出为

[1] 10  9  8  7  6  5  4  3  2  1

上述利用“:”只能生成步长为1的向量,若要生成任意步长的向量需要使用函数seq(),它有三个参数,(最小值,最大值,步长)。如:

输入

x<-seq(1,20,2)

x

输出为

[1]  1  3  5  7  9 11 13 15 17 19

输入

x<-seq(1,5,0.5)

x

输出为 

[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

别外一个函数rep()可以通过重复一个基本数值或数值对象多次来创建一个较长的向量,它有二个参数,(数据,重复次数)。如:

输入

x<-rep(1,10)

x

输出

[1] 1 1 1 1 1 1 1 1 1 1

输入

x<-rep(c(1,2,3),3)

x

输出

[1] 1 2 3 1 2 3 1 2 3

c. 向量索引

向量索引也称为向量中数值元素的下标,用来引用向量中的单个数值,用方括号[]表示,如:

输入

x<-c(1,2,3,4,5)

x[1]

输出

[1] 1

向量索引除了引用单个值之外,还起过滤的作用,如:

输入

x<-c(1,2,3,4,5)

x[x>3]

输出x中大于3的数值

[1] 4 5

d.常用的向量函数

函数名 功能 示例,已知x<-c(2,1,5,3,4)y<-c(8,9)
输入 输出
sum 求和 sum(x) [1] 15
max 最大值 max(x) [1] 5
min 最小值 min(x) [1] 1
mean 均值 mean(x) [1] 3
length 长度 length(x) [1] 5
var 方差 var(x) [1] 2.5
sd 标准差 sd(x) [1] 1.581139
median 中位数 median(x) [1] 3
quantile 五个分位数 quantile(x) 0%  25%  50%  75%  100% 
 
 1   2    3    4    5
sort 排序 sort(x) [1] 1 2 3 4 5
   
sort(x,TRUE) [1] 5 4 3 2 1
rev 倒序 rev(x) [1] 4 3 5 1 2
append 添加 append(x,8) [1] 2 1 5 3 4 8
   
append(x,y) [1] 2 1 5 3 4 8 9
replace 替换 replace(x,1,7) [1] 7 1 5 3 4
   
replace(x,c(1,2),7) [1] 7 7 5 3 4

提示:利用help函数可以查看R语言文档。例如,当不知道replace函数的功能时,输入help(replace)或者?(replace),在RStudio右下的help窗口中即显示repalce函数的详细说明。

二、矩阵

矩阵运算虽然是统计理论的重要工具。

R语言中的矩阵基本等同与数学中的矩阵。R语言中使用matrix函数创建一个矩阵。matrix函数有三个参数,(数值向量,行数,列数)。如:

输入

x<-matrix(c(1,2,3,4),2,2)

x

输出两行两列的矩阵及其行号和列号

     [,1]  [,2]

[1,]    1    3

[2,]    2    4

matrix还有第四个参数byrow,即数据向量转为矩阵时数据的排列顺序,其默认值为FALSE,如:

输入

x<-matrix(c(1,2,3,4),2,2,TRUE)

输出

     [,1]  [,2]

[1,]    1    2

[2,]    3    4

a. 矩阵运算

矩阵的+-*/运算是对矩阵元素的运算,如:

输入

x<-matrix(c(1,2,3,4),2,2)

x*2

输出

     [,1]  [,2]

[1,]    2    6

[2,]    4    8

输入

x<-matrix(c(1,2,3,4),2,2)

y<-matrix(c(5,6,7,8),2,2)

x+y

输出

     [,1]  [,2]

[1,]    6   10

[2,]    8   12

矩阵运乘法运算符号为%*%,如:

输入

x<-matrix(c(1,2,3,4),2,2)

y<-matrix(c(5,6,7,8),2,2)

x%*%y

输出

     [,1]  [,2]

[1,]   23   31

[2,]   34   46 

b. 矩阵下标

矩阵下标类似向量的下标。所不同的是,向量是两维的,下标包括两个数字,表示相应元素所在的行和列,如:

输入

x<-matrix(c(1,2,3,4),2,2)

x[1,2]

输出第一行第二列元素

[1] 3

c. 常用的矩阵函数

函数名 功能
diag 取对角元素/生成对角阵
solve 求逆/解线性方程组
eigen 求特征向量/特征值
rank 求秩(元素位置,矩阵秩可用qr()$rank)
t 转置
det 行列式
  

三、列表

向量、矩阵和数组要求元素必须为同一基本数据类型。如果一组数据需要包含多种类型的数据,则可以使用列表,如:

输入

x<-list(a=1,b=2,c=3)

输出为

​
$a

[1] 1

$b

[1] 2

$c

[1] 3

与向量、矩阵和数组相比,列表没有下标号,但是每个数据都有一个名字。数组使用下标来引用元素,而列表用名字来引用元素,如:

输入

输出

[1] 1

列表与向量、矩阵和数组的另一个重要区别是,向量、矩阵和数组的元素只能是一个简单基本数据,而列表的元素还可以是其他的其他各种数据对象,比如向量、矩阵、数组或者另一个列表,如:

输入

x<-list(a=1,b=c(1,2,3),c="ab",d=c("a","c","c"),e=matrix(c(1,2,3,4),2,2),f=list(a=1,b=2))

x

         这是一个复杂的列表,a为数字,b为向量,c为字符,d为字符向量,e为矩阵,而f为另一个列表。输出为

$a

[1] 1

$b

[1] 1 2 3

$c

[1] "a"

$d

[1] "a""c""c"

$e

     [,1] [,2]

[1,]    1    3

[2,]    2    4

$f

$f$a

[1] 1

$f$b

[1] 2

列表的名字可以连续引用,输入

x$f$a

输出 为

[1] 1

四、数据框

数据框是另一种可以有不同基本数据类型元素的数据对象。简单来说,一个数据框包含多个向量,向量的数据类型可以不一样。因此,数据框是介于数组和列表之间的一种数据对象,与矩阵相比它可有不同数据类型,与列表相比它只能包含向量,而且这些向量的长度通常是相等的。

a. 创建数据框

R语言使用data.frame()来创建数据框,如:输入


x<-c("张三","李四","王五","赵六")

y<-c("男","女","女","男")

z<-c(89,90,78,67)

data.frame(x,y,z)

输出为


     x  y  z

1 张三 男 89

2 李四 女 90

3 王五 女 78

4 赵六 男 67

其中,每行行首的数字是该行名字,可以使用row.names()来重新为每行命名。

输入

row.names(student)<-c("a","b","c","d")

student

输出

     x  y  z

a 张三 男 89

b 李四 女 90

c 王五 女 78

d 赵六 男 67

当然,数据框中每列向量也可以有名字,如:

输入

data.frame(姓名=x,性别=y,分数=z)

输出为

  姓名 性别 分数

1 张三   男   89

2 李四   女   90

3 王五   女   78

4 赵六   男   67

注意,这些的姓名、性别和分数为变量,所以不能加引号。

b. 数据框中数据的引用

获取数据框中的一行或多行:

输入

student[1,]

输出

     x  y  z

a 张三 男 89

输入

student[(1:2),]

输出

     x  y  z

a 张三 男 89

b 李四 女 90

获取数据框一列或多列:

输入

student[,1]

输出

[1] 张三 李四 王五 赵六

输入

student[,(1:2)]

输出

     x  y

a 张三 男

b 李四 女

c 王五 女

d 赵六 男

还可以用访问列表数据的方式访问数据框:

输入

student$x

输出

[1] 张三 李四 王五 赵六

同向量的引用一样,可以过滤数据框中的数据,如:

输入

student[student$y>80,]

输出

     x  y  z

a 张三 男 89

b 李四 女 90