9 向量化的ifelse()函数
ifelse()的函数形式如下:
ifelse(b,u,v),该函数的返回值是一个向量,如果b[i]为真,则返回的是第i个元素u[i],如果b[i]的假,则返回值的第i个元素为v[i].看例子就明白了。
> x<-1:10
> y<-ifelse(x%%2==0,5,12)
> y
[1] 12 5 12 5 12 5 12 5 12 5
扩展案例:度量相关性
考虑向量x和y,它们是时间序列,我们定义两者的相关性为x和y同时上升或下降次数占总观测数的比例,即y[i+1]-y[i]与x[i+1]-x[i]符号相同时的次数占总次数i的比例。以下是代码:
在脚本文件(“r2_9_1.R”)中的代码:
findud<-function(v){
vud<-v[-1]-v[-length(v)]
return(ifelse(vud>0,1,-1))
}
udcorr<-function(x,y){
ud<-lapply(list(x,y),findud)
return(mean(ud[[1]]==ud[[2]]))
}
控制台里面的代码:
> source("r2_9_1.R")
> x
[1] 5 2 9 12
> x<-c(5,12,13,3,6,0,1,15,16,8,88)
> x
[1] 5 12 13 3 6 0 1 15 16 8 88
> y<-c(4,2,3,23,6,10,11,12,6,3,2)
> y
[1] 4 2 3 23 6 10 11 12 6 3 2
> udcorr(x,y)
[1] 0.4
> u<-c(1,6,7,2,3,5)
> u
[1] 1 6 7 2 3 5
> diff(u)
[1] 5 1 -5 1 2
> vud<-diff(d)
> vud
[,1] [,2]
b 2 2
> u<-c(1,6,7,2,3,5)
> diff(u)
[1] 5 1 -5 1 2
> sign(diff(u))
[1] 1 1 -1 1 1
知识点:(1)lapply的使用格式为:
Lapply(X,FUN,...)
lapply的返回值是和一个和X有相同长度的list对象,这个list对象中这个list对象中的每个元素是将函数FUN应用到X的每一个元素。其中X为List对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。(简单理解就是x(是一个list)中每一个项都被作为FUN函数的参数去执行,然后返回的值就是lapply的返回值,就是此例题中的ud,ud的长度和X的长度是一样的,此例为2)
(2)ud[[1]]
因为ud是一个list,list里面有两个向量组成,所以要用两个中括号的形式
(3)diff()函数
diff()函数主要是比较向量中当前元素的下一个元素与当前元素的差值。返回的结果也是一个向量。
(4)sign()函数
Sign()函数是根据向量中每一个元素的正值、零、负值分别返回1,0,-1.
扩展案例:对鲍鱼数据采集重新编码
> g<-c("M","F","F","I","M","M","F")
> ifelse(g=="M",1,ifelse(g=="F",2,3))
[1] 1 2 2 3 1 1 2
这个就是ifelse的一个简单应用