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

 

扩展案例:度量相关性

考虑向量xy,它们是时间序列,我们定义两者的相关性为xy同时上升或下降次数占总观测数的比例,即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的每一个元素。其中XList对象(该list的每个元素都是一个向量),其他类型的对象会被R通过函数as.list()自动转换为list类型。(简单理解就是x(是一个list)中每一个项都被作为FUN函数的参数去执行,然后返回的值就是lapply的返回值,就是此例题中的udud的长度和X的长度是一样的,此例为2

(2)ud[[1]]

   因为ud是一个listlist里面有两个向量组成,所以要用两个中括号的形式

(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的一个简单应用

更多推荐

R语言向量_向量化的ifelse()函数