这里写自定义目录标题
R学习
《统计建模与R软件》清华大学出版社
2.2.1向量
- 向量赋值
x <- c(10.4, 5,3,6,21)
c(10.4, 5,3,6,21) ->y
assign("z",c(10.4, 5,3,6,21))
-
向量运算
+,- ,
*,/,^ (对于向量是对每个分量计算)
5 %/% 3=1(整数除法)
5 %% 3 = 2(求余数)
log, exp, cos, tan, sqrt (对于向量是对每个分量计算)
(作为复数计算:sqrt(-2+0i)) -
与向量运算有关的函数
x是个向量
min(x), max(x), range(x) = [min(x), max(x)]
which.min(x) , which.max(x)(第几个分量求到最小/大)
sum(x) (=
∑
i
=
1
n
x
i
\sum_{i=1}^{n}x_i
∑i=1nxi分量之和)
prod(x) (=
∏
i
=
1
n
x
i
\prod_{i=1}^{n}x_i
∏i=1nxi 分量连乘积)
length(x) (=n)
median(x) 中位数
mean(x) 均值
var(x) 方差
sd(x) 标准差
sort(x) 顺序统计量(增序排序)
order(x), sort.list(x) 列出顺序统计量的下标
2.2.2 产生有规律的序列
- 等差数列
> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1
> 1:5.3
[1] 1 2 3 4 5
> 5.3:1
[1] 5.3 4.3 3.3 2.3 1.3
等差运算优先于乘法运算
> 2*1:5
[1] 2 4 6 8 10
> n<-5
> 1:n-1
[1] 0 1 2 3 4
> 1:(n-1)
[1] 1 2 3 4
-
等间隔
seq(from= value1, to= value2, by= value3)
seq(step= value1, from= value2, by= value3) -
重复函数
> x<-1:5
> s<-rep(x,times=3);s
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
2.2.3逻辑向量
<, <=, >, >=, ==, !=
a&b a与b
a|b a或b
!a 非a
逻辑变量也可以赋值
> a<-c(TRUE, FALSE, T, F);a
[1] TRUE FALSE TRUE FALSE
> c=1:7;c
[1] 1 2 3 4 5 6 7
> all(c>3)
[1] FALSE
> any(c>3)
[1] TRUE
2.2.4 缺失数据
NA
表示某处数据缺失
> z<-c(1:3,NA);z
[1] 1 2 3 NA
> ind <- is.na(z);ind #检测缺失数据
[1] FALSE FALSE FALSE TRUE
> z[is.na(z)]<-0;z #缺失数据改为0
[1] 1 2 3 0
> x<-c(0/1,0/0,1/0,NA);x
[1] 0 NaN Inf NA
> is.na(x)
[1] FALSE TRUE FALSE TRUE
> is.nan(x) #检测数据是否不确定
[1] FALSE TRUE FALSE FALSE
> is.finite(x) #检测数据是否有限
[1] TRUE FALSE FALSE FALSE
> is.infinite(x) #检测数据是否无无穷
[1] FALSE FALSE TRUE FALSE
2.2.5 字符型向量
> paste("my","job")
[1] "my job"
> paste("X",1:6,sep = "")
[1] "X1" "X2" "X3" "X4" "X5" "X6"
> paste(1:10)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
> paste(c('a','b'),collapse = '.')
[1] "a.b"
2.2.6 复数向量
complex(re=,im=) 生成复数向量
Re(), Im() 计算复数的实、虚部
Mod() 计算复数的模
Arg() 计算复数的幅角
> x<-seq(-pi, pi, by = pi/10)
> y<-sin(x)
> z<-complex(re=x, im=y)
> plot(z)
> lines(z)
2.2.7 向量下标运算
> x<-c(1,4,7)
> x[2]
[1] 4
> x[2]<-125 ; x
[1] 1 125 7
> x[c(1,3)]<-c(144,169);x
[1] 144 125 169
v为和x等长的逻辑向量,x[v]
表示取出所有v为真值的元素
> x<-c(1,4,7);x<5
[1] TRUE TRUE FALSE
> x[x<5]
[1] 1 4
> z<-c(-1,1:3,NA) #将向量中非缺失数据赋给另一个向量
> y<-z[!is.na(z)];y
[1] -1 1 2 3
> (z+1)[(!is.na(z))&z>0]->x;x #作相应运算
[1] 2 3 4
可用于定义分段函数
例如:
y
=
{
1
−
x
,
x
<
0
,
1
+
x
,
x
⩾
0.
y= \left\{ \begin{aligned} 1-x, & x<0, \\ 1+x, & x \geqslant 0. \end{aligned} \right.
y={1−x,1+x,x<0,x⩾0.
> y<- numeric(length(x))
> y[x<0] <- 1-x[x<0]
> y[x>=0] <- 1+x[x>=0]
> c("a","b","c")[rep(c(1,2,3),times=3)]
[1] "a" "b" "c" "a" "b" "c" "a" "b" "c"
> v<-10:20
> v[-(1:5)] #表示扣除相应元素
[1] 15 16 17 18 19 20
向量的元素可以加上名字,利用名字访问
> ages <- c(li=33, zhang=29, liu=18);ages
li zhang liu
33 29 18
> ages["zhang"]
zhang
29
> fruit <- c(5,10,1,20)
> names(fruit) <- c("orange","banana","apple","peach");fruit ##名字也可以后加
orange banana apple peach
5 10 1 20
2.5 多维数组和矩阵
2.5.1 生成数组或矩阵
向量只有在定义了维数(dim)后才能被看作是数组。
> z<-1:12
> dim(z)<-c(3,4);z
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> dim(z)<-12 #也可以把向量定义为一维数组
> z
[1] 1 2 3 4 5 6 7 8 9 10 11 12
可以用array()函数直接构造数组
array(data = NA, dim = length(data), dimnames = NULL)
> x<-array(1:20,dim=c(4,5));x
[,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
> z<-array(0,dim=c(3,4,2)) #数组初始化的方法
用matrix()函数构造矩阵
matrix(data=NA, nrow=1, ncol=1, byrow = FALSE, dimnames = NULL)
2.5.2 数组下标
> a <- 1:24
> dim(a) <- c(2,3,4)
> a[1,2:3,2:3]
[,1] [,2]
[1,] 9 15
[2,] 11 17
> a[, 2, ]
[,1] [,2] [,3] [,4]
[1,] 3 9 15 21
[2,] 4 10 16 22
> a[3:10] #忽略维数,对数组的数据向量取子集
[1] 3 4 5 6 7 8 9 10
> b <- matrix(c(1,1,1,2,2,3,1,3,4,2,1,4), ncol=3, byrow=T);b
[,1] [,2] [,3] #下标数组,每一行是一个元素的下标
[1,] 1 1 1
[2,] 2 2 3
[3,] 1 3 4
[4,] 2 1 4
> a[b]
[1] 1 16 23 20
> a[b]<-c(101,102,103,104) #还可以对他们赋值
2.5.3 数组的四则运算
数组的四则运算:对 dim 属性完全相同的数组可以进行四则运算(+, -,*,/),是对应位置元素的运算。
(形状不同的向量(数组)也可以运算:把短的循环用)
2.5.4 矩阵的运算
t(A)
A的转置
det()
求方阵行列式的值
x %*% y
相同维数向量求内积
x %o% y
相当于 outer(x,y)
相同维数向量求外积
A%*%B
表示两矩阵的乘积(矩阵乘法)
x %*% A %*% x
表示二次型
crossprod(A,B)
相当于 t(A) %*% B
tcrossprod(A,B)
相当于 A %*% t(B)
diag(v)
以v的元素为对角线元素的对角阵(v是一个向量)
diag(M)
取M对角线上元素的向量
solve(A,b)
求解线性方程组
A
x
=
b
Ax=b
Ax=b
solve(A)
求矩阵
A
A
A的逆
eigen(Sm)
求对称矩阵Sm的特征值和特征向量
> A = array(c(1:8, 10), dim = c(3,3))
> Sm = crossprod(A,A);
> ev <- eigen(Sm);ev #ev由列表形式给出
eigen() decomposition
$values
[1] 303.19533618 0.76590739 0.03875643
$vectors
[,1] [,2] [,3]
[1,] -0.2093373 0.96438514 0.1616762
[2,] -0.5038485 0.03532145 -0.8630696
[3,] -0.8380421 -0.26213299 0.4785099
svd(A)
对矩阵
A
A
A作奇异值分解
A
=
U
D
V
T
A = UDV^T
A=UDVT
> svdA <- svd(A);svdA
$d
[1] 17.4125052 0.8751614 0.1968665
$u
[,1] [,2] [,3]
[1,] -0.4646675 0.833286355 0.2995295
[2,] -0.5537546 -0.009499485 -0.8326258
[3,] -0.6909703 -0.552759994 0.4658502
$v
[,1] [,2] [,3]
[1,] -0.2093373 -0.96438514 0.1616762
[2,] -0.5038485 -0.03532145 -0.8630696
[3,] -0.8380421 0.26213299 0.4785099
> attach(svdA)
> u %*% diag(d) %*% t(v)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 10
lsfit(X, y)
最小二乘拟合,ls.diag()
给出拟合的进一步统计信息
qr()
QR分解函数
2.5.5 与矩阵(数组)运算有关的函数
dim(A)
nrow(A)
ncol(A)
得到矩阵
A
A
A的维数、行数、列数
cbind()
rbind()
分别把自变量横、纵向拼成一个大矩阵
as.vector(A)
可把矩阵转化为向量(按列)
dimnames(X)
colnames(X)
rownames(X)
2.7 读、写数据文件
2.7.1 读纯文本文件
read.table()
函数:读表格形式的文件
scan()
函数: 直接读纯文本文件数据