上一章我们了解了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. 快速生成有序向量(函数seq和rep)
在需要大量有序数值向量时,为了避免手工输入的麻烦,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