《R语言编程艺术》书上代码实现---第二章向量

第二章向量

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,as.is=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)) #对向量有扁平化的效果
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值