第二章向量
2.1 标量、向量、数组与矩阵
typeof(x)#查看变量的类型
#2.1.1添加或删除向量元素
x=c(88,5,12,13)
x=c(x[1:3],168,x[4])#插入168
x
#2.1.2获取向量长度
length(x)
x=c()
x
length(x)
1:length(x)
#2.1.3作为向量的矩阵和数组
m
m+10:13
2.2声明
z=3
z
y=vector(length=2) #创建二元向量
y[1]=5
y[2]=12
y
y=c(5,12)
x=c(1,5)
x
x="abc"
x
2.3循环补齐
c(1,2,4)+c(6,0,9,20,22)
x=rbind(c(1,4),c(2,5),c(3,6))
x
x+c(1,2) #竖着补齐
###2.4常用的向量运算
#2.4.1向量运算和逻辑运算
2+3 #加号是函数
"+"(2,3)
x=c(1,2,4)
x*c(5,0,-1)
x/c(5,4,-1)
x%%c(5,4,-1)#取余数
#2.4.2向量索引
y=c(1.2,3.9,0.4,0.12)
y[c(1,3)]
y[2:4]
v=3:4
y[v]
x=c(4,2,17,5)
y=x[c(1,1,3)]#元素重复是允许的
y[-1]
y[-1:-2]
y[1:length(y)-1] #去除最后一个元素
y[-length(y)]
#2.4.3用:运算符创建向量
5:8
i=5
1:i-1#冒号的优先级高于减号
1:(i-1)
?Syntax #优先级的详细说明
#2.4.4使用seq()创建向量
#生成等差数列
seq(from=12,to=30,by=3) #生成间隔为3的向量
seq(from=1.1,to=2,length=10)
x=c(5,12,13)
seq(x)#x非空和1:length(X)结果一样
1:length(x)
x=NULL
seq(x)
length(x)
# 2.4.5使用rep()重复向量常数
rep(8,4)
rep(c(5,12,13),3)
rep(1:3,2)
rep(c(5,12,13),each=2)#x交替重复的次数
2.5使用any()和all()
x=1:10
any(x>8)#是否至少一个 一个T或F
any(x>88)
all(x>88)
all(x>0)
x>8
### 2.5.1扩展案例:寻找连续出现1的游程
findruns <- function(x,k) {
n <- length(x)
runs <- NULL
for (i in 1:(n-k+1)) {
if (all(x[i:(i+k-1)]==1)) runs <- c(runs,i)
}
return(runs)
}
y=c(1,0,0,1,1,1,0,1,1)
findruns(y,2)
findruns(y,6)
#预先分配内存空间?????
findruns1 <- function(x,k) {
n <- length(x)
runs <- vector(length=n) #长度为n的向量分配内存空间
count <- 0
for (i in 1:(n-k+1)) {
if (all(x[i:(i+k-1)]==1)) {
count <- count + 1
runs[count] <- i #填充runs
}
}
if (count > 0) {
runs <- runs[1:count] #重新定义runs
} else runs <- NULL
return(runs)
}
findruns1(y,2)
#2.5.2扩展案例:预测离散值时间序列
preda <- function(x,k) {
n <- length(x)
k2 <- k/2
# the vector pred will contain our predicted values
pred <- vector(length=n-k)
for (i in 1:(n-k)) {
if (sum(x[i:(i+(k-1))]) >= k2) pred[i] <- 1 else pred[i] <- 0
}
return(mean(abs(pred-x[(k+1):n])))
}
predb <- function(x,k) {
n <- length(x)
k2 <- k/2
pred <- vector(length=n-k)
sm <- sum(x[1:k])
if (sm >= k2) pred[1] <- 1 else pred[1] <- 0
if (n-k >= 2) {
for (i in 2:(n-k)) {
sm <- sm + x[i+k-1] - x[i-1]
if (sm >= k2) pred[i] <- 1 else pred[i] <- 0
}
}
return(mean(abs(pred-x[(k+1):n])))
}
predc <- function(x,k) {
n <- length(x)
k2 <- k/2
# the vector red will contain our predicted values
pred <- vector(length=n-k)
csx <- c(0,cumsum(x))
for (i in 1:(n-k)) {
if (csx[i+k] - csx[i] >= k2) pred[i] <- 1 else pred[i] <- 0
}
return(mean(abs(pred-x[(k+1):n])))
}
2.6向量化运算符
#2.6.1向量输入向量输出
u=c(5,2,8)
v=c(1,3,9)
u>v
w=function(x) return(x+1)
w(u)
sqrt(1:9) #开根号
y=c(1.2,3.9,0.4)
z=round(y)
z
round(1.2)
y=c(12,5,13)
y+4
"+"(y,4)
f=function(x,c) return((x+c)^2)
f(1:3,0)
f(1:3,1)
f(1:3,1:3)
f=function(x,c){
if (length(c)!=1) stop("vector c not allowed") #将c限制为标量
return((x+c)^2)
}
f(1:3,2)
# 2.6.2 向量的输入,矩阵输出
z12=function(z) return(c(z,z^2))
z12(1:8)
matrix(z12(1:8),ncol=2)
#simplify apply简化函数
sapply(1:8,z12)
2.7NA与NULL值
#R语言中只有NA和NULL
#2.7.1NA的使用c
#NA是缺失值
x=c(88,NA,12,168,13)
mean(x)
mean(x,na.rm = T) #na.rm = T一处NA设置为真T
mode(x[1])
mode(x[2])
y=c("abc","def",NA)
mode(y[3])
#2.7.2NULL的使用
z=NULL
for (i in 1:10) if (i%%2==0) z=c(z,i)
z
#寻找偶数的方法
seq(2,10,2)
2*1:5
z=NA
for(i in 1:10) if (i%%2==0) z=c(z,i)
z
u=NULL
length(u)
v=NA
length(v)#空值被计数
2.8筛选
#2.8.1生成筛选索引
z=c(5,2,-3,8)
w=z[z*z>8]
z*z>8
"+"(2,1) #实际上是一个函数
">"(3,4)
">"(z*z,8)
x=c(1,3,8,2,20)
x[x>3]=0
x
#2.8.2使用subset()函数筛选
#subset()函数进行筛选,与普通函数的区别是NA值处理
x=c(1,3,8,2,20,NA)
x[x>5]
subset(x,x>5) #不显示NA值
#2.8.3选择函数which()
which(x>8)#返回满足条件的所在位置
#在一个向量中找出满足一定套件的元素首次出现的位置
first1 <- function(x) {
for (i in 1:length(x)) {
if (x[i] == 1) break # break out of loop
}
return(i)
}
first2 <- function(x) {
for (i in seq(x)) {
if (x[i] == 1) break # break out of loop
}
return(i)
}
fist1a=function(x) return(which(x==1)[1])
x=c(2,2,1,4)
fist1a(x)
first1(x)
first2(x)
2.9向量化ifelse()函数
#ifelse(b,u,v) b是布尔形式,u、v是向量
x=1:10
y=ifelse(x%%2==0,5,12) #偶数取5 奇数取12
y
x=c(5,2,9,12)
ifelse(x>6,2*x,3*x)
#2.9.1扩展案例:度量相关性
findud <- function(v) {
vud <- v[-1] - v[-length(v)] #判断是否同增同减
#vud=diff(v)
return(ifelse(vud > 0,1,-1))
}
udcorr <- function(x,y) {
ud <- lapply(list(x,y),findud)
return(mean(ud[[1]] == ud[[2]]))#true和false构成0,1
}
udcorr1=function(x,y) mean(sign(diff(x))==sign(diff(y)))
x=c(5,12,13,3,6,0,1,15,16,8,88)
y=c(4,2,3,23,6,10,11,12,6,3,2)
lapply(list(x,y),findud) #利用lapply函数可以对x,y进行两次findud函数
udcorr(x,y)
udcorr1(x,y)
#滞后函数 默认滞后一期
diff(x)
#高级函数正值、零、负值
sign(diff(x))
#2.9.2扩展案例:对鲍鱼数据集重新编码
g=c("M","F","F","I","M","M","F")
g
ifelse(g=="M",1,ifelse(g=="F",2,3))
#ab[,1]=ifelse(ab[,1]=="M",1,ifelse(ab[,1]=="F",2,3)) 数列里重编码
m=which(g=="M")
m
grps=list()
for (gen in c("M","F","I")) grps[[gen]]=which(g==gen)
grps
aba <- read.csv("abalone.data",header=T,=T)
#数据框重命名
names(aba)=c( "sex", "Length", "Diam", "Height", "Whole", "Shucked", "Viscera", "Shell", "Rings" )
head(aba)
grps <- list()
for (gen in c("M","F")) grps[[gen]] <- which(aba[,1]==gen)
abam <- aba[grps$M,]
abaf <- aba[grps$F,]
plot(abam$Length,abam$Diameter)
plot(abaf$Length,abaf$Diameter,pch="x",new=FALSE)
2.10 测试向量相等
x=1:3
y=c(1,3,4)
x==y
"=="(3,4)
i=2
"=="(i,2)
#改用
all(x==y)
#identical()函数
x=1:2 #产生的是整数
y=c(1,2) #产生的是浮点数
x
y
identical(x,y) #比较两个对象是否完全一样
typeof(x)
typeof(y)
2.11 向量元素的名称
#命名
x=c(1,2,4)
names(x)
names(x)=c("a","b","ab")
x
names(x)=NULL#可将命名移除
x
2.12 关于c()的更多内容
c(5,2,"abc") #不同类型时将被降级为同一类型
c(5,2,list(a=1,b=4))
c(5,3,c(1.5,6)) #对向量有扁平化的效果