R语言-数据结构-向量2

1.向量化运算符

1.1向量输入、向量输出

**应用到向量上的函数,实际应用到向量的每个元素上。**如:>函数应用到向量u,v上,实际是应用到了向量的每个元素之上,也就是说判断u[1]>v[1],u[2]>v[2],u[3]>v[3]吗?其结果是,逻辑值。

> u<-c(5,2,8)
> v<-c(1,3,9)
> u>v
[1]  TRUE FALSE FALSE

实际上,在R中,所有的函数(包括运算符之类的)都是向量化运算。如果一个函数使用了向量化运算符,那么它也被向量化了。
函数w因为使用了+运算符,所以函数w()也被向量化。内置的r函数也是同样的。

> w<-function(x)return(x+1)
> w(u)
[1] 6 3 9
#########运算函数
log(16,base = 2)###以2为底
log(16)####自然对数,以e为底
log10 (10)
ceiling(c(-2.3,3.1415))###返回不小于x的最大整数
floor(c(-2.3,3.1415))####返回不大于x的最大整数
trunc(c(-2.3,3.1415))###返回整数部分
round(c(-2.3,3.1415),digits = 2)###四舍五入
signif(c(-2.3,3.1415))####保留有效数字

如:x+c,x是一个向量,看起来c是一个标量(其实是一个一元向量);在r中,x+c实际上是[1,2,3]+[1,1,1]这样的形式,R会将c循环补齐。R并没有告知我们不能使用显式向量给c赋值,因此,使用向量(1,2,3)给c赋值也可以得到准确的结果。
如果x是一个标量,c也是一个标量,那么函数f的结果是一个标量。

> f<-function(x,c)return((x+c)^2)
> f(1:3,0)
[1] 1 4 9
> f(1:3,1)
[1]  4  9 16
> f(1:3,1:3)
[1]  4 16 36

如果要把c限制为标量,则需要加上限制条件。

f<-function(x,c){
  if(length(c)!=1){
    stop("vector c  not allowed")
  }
  return((x+c)^2)
}

1.2 向量输入、矩阵输出

如果函数z的输出是一个向量,那么对这个函数使用2和c(1,2),结果是:

> z12<-function(z)return(c(z,z^2))
> z12(2)
[1] 2 4
> z12(c(1,2))
[1] 1 2 1 4

如果将其排列成矩阵的形式,

> matrix(z12(c(1,2)),ncol=2)
     [,1] [,2]
[1,]    1    1
[2,]    2    4

2.NA和NULL值

NA是缺失值,NULL是不存在的值。
在R的很多统计函数中,要求跳过缺失值(NA)。但是R不会自动跳过,通常我们需要手动跳过;而null值是自动跳过的。

3.筛选

筛选是R中常用的运算之一。

3.1 生成筛选索引

x[x>3 & x<20]   ####输出x>3且x<20的元素 

y[c(T,F,T,T,F)]   ####输出逻辑值为T的对应的元素
y[c(T,F)]    ###可以重复使用

3 %in% x         ####判断元素3是否在向量x中,返回的是逻辑值
x[x %in% c(1,2,3)]####输出向量x与向量(1,2,3)相同的元素
k<- x %in% c(1,2,3)
x[k]                ###结果同上

3.2 用subset()函数筛选

如果向量中含有NA,用索引的方法是去不掉缺失值的,R会认为该缺失值是未知数,所以R会保留它;如果我希望去掉缺失值,就可以采用subset()函数去掉缺失值。

> x<-c(1,6,NA,8)
> x[x>5]
[1]  6 NA  8
> subset(x,x>5)
[1] 6 8

3.3 选择函数which()

which()函数返回满足条件的元素的索引。

> f<-c(1,9,3,5,6,20,2)
> which.max(f)  ####返回最大值的索引(位置)
[1] 6
> which.min(f)
[1] 1
> which(f==9)
[1] 2
> which(f>3)
[1] 2 4 5 6
#########统计函数
vec<-1:100
range(vec)###返回向量的最大值和最小值
prod(x)####返回向量所有元素的积
quantile(vec)####求分位数
quantile(vec,c(0.4,0.6))

如果向量中满足条件的元素有两个,那么which函数返回这两个元素的索引,其返回值是向量

> x<-c(2,3,1,4,12,1)
> which(x==1)  
[1] 3 6

如:找出向量中的第一个1.

###不用which的方法
x<-c(2,3,1,4,12,1)
judge<-function(x){
  for(i in seq(x)){
    if(x[i]==1)break
  }
  return(i)
}
judge(x)
####使用which的方法
judge<-function(x){
  return(which(x==1)[1]) ###which()[1]表示满足条件的第一个索引
}
judge(x)

3.4 向量化的ifelse()函数

语法结构:ifelse(b,u,v),b是布尔值向量,U,V为向量
该函数返回值为向量;如果b[i]为真,则返回u[i];如果为假,则返回v[i].

x>6的结果是(F,F,T,T)
2x=(10,4,18,24)
3
x=(15,6,27,36)
用(F,F,T,T)去判断2x和3x该取哪个位置的元素。结果是,2x这里取的是18,24;3x这里取的是15,6.最终结果是(15,6,18,24)

> x<-c(5,2,9,12)
> ifelse(x>6, 2*x ,3*x)
[1] 15  6 18 24

如:我希望产生这样一个向量,元素为偶数的位置为5,奇数位置为12。(其实,它的逻辑是:先判断向量中的元素是否为偶数,是true,否false,那么得到的是逻辑值向量(F,T,F,T,F,T,F,T,F,T);然后
u=(5,5,5,5,5,5,5,5,5,5),v=(12,12,12,12,12,12,12,12,12,12),用(F,T,F,T,F,T,F,T,F,T)判断向量y的哪些位置为5,哪些位置为12.

> x<-1:10
> y<-ifelse(x %% 2== 0,5,12)
> y
 [1] 12  5 12  5 12  5 12  5 12  5
####不用ifelse()函数
findud<-function(x,y){
  k<-0
  j<-0
  n<-length(x)
  for(i in 1:(n-1)){
    if((x[i+1]-x[i])>0 & (y[i+1]-y[i])>0){
      k<- k+1
    } 
  }
  for(i in 1:(n-1)){
    if((x[i+1]-x[i])<0 & (y[i+1]-y[i])<0){
      j<-j+1
    } 
  }
  return((k+j)/(n-1))
}
x<-c(4,3,5,6,7,4,2,6,7)
y<-c(1,3,5,7,8,5,4,3,1)
findud(x,y)
##修改后
findud<-function(x,y){
  k<-0
  j<-0
  v<-x[-1]-x[-length(x)] ##diff(x)
  w<-y[-1]-y[-length(y)] ###diff(y)
  n<-length(v)
  for(i in 1:n){
    if(v[i]>0 & w[i]>0){
      k<- k+1
    } 
  }
  
  for(i in 1:n){
    if(v[i]<0 & w[i]<0){
      j<-j+1
    } 
  }
  return((k+j)/n)
}
x<-c(4,3,5,6,7,4,2,6,7)
y<-c(1,3,5,7,8,5,4,3,1)
findud(x,y)


###用ifelse()函数、lappy
findud<-function(v){
  vud<- v[-1]-v[-length(v)]###diff(v)
  return(ifelse(vud > 0,1,-1))
}

udcorr<-function(x,y){
  ud<-lapply(list(x,y),findud)
  ###lappy(list,function) ,用function对列表对象进行操作,其返回值也是列表
  return(mean(ud[[1]]==ud[[2]]))
}
x<-c(4,3,5,6,7,4,2,6,7)
y<-c(1,3,5,7,8,5,4,3,1)
udcorr(x,y)
###用sign()函数、diff()
##该函数可以根据参数向量中元素的正负,将其转化为1,0,-1

udcorr<-function(x,y){
  mean(sign(diff(x))==sign(diff(y)))
}
x<-c(4,3,5,6,7,4,2,6,7)
y<-c(1,3,5,7,8,5,4,3,1)
udcorr(x,y)

ifelse()可以嵌套

一个简单小例子:鲍鱼数据集


g<-c("M","F","F","I","M","M","F")
###按照性别形成子集
m<-which(g=="M")
f<-which(g=="F")
i<-which(g=="I")
m
####把子集存储在列表中
grp<-list()
for(gen in c("M","F","I") ){
  grp[[gen]]=which(g==gen)
}

####ifelse()可以嵌套
ab[,1]<-ifelse(ab[,1]=="M",1,ifelse(ab[,1]=="F",2,3))
###将性别表示为1,2,3


###鲍鱼数据集
ab<-read.csv("C:/Users/NANRUN/Desktop/abalone.csv")
grps<-list()
for(gen in c("M","F","I")){
  grps[[gen]]=which(ab[,1]==gen)
}
###按性别形成子集并用列表存储
abm<-ab[grps$M,]###性别为M的数据
abf<-ab[grps$F,]
plot(abm$Length,abm$Diameter)###画出雄性鲍鱼的长度和直径的散点图
plot(abf$Length,abf$Diameter,pch="x",new=F)
###希望将雄性与雌性的图画在一张图上,所以new=F告诉R不创建新图形,pch="x"表示图形的符号是x,而不是默认的O.

3.5 测试向量相等

如果要判断两个向量是否相等?用“==”将不可行,下面的例子的结果是判断向量中的元素是否相等,而不是向量相等。

> a<-1:3
> b<-c(1,3,4)
> a==b
[1]  TRUE FALSE FALSE

如果要判断向量相等,可以用all()函数或者identical()函数

> all(a==b)###条件全为真才真
[1] FALSE
> identical(a,b)###判断a,b是否完全一致
[1] FALSE

但是,identical()函数判断两个对象是否完全一致,如果这两个对象的数据类型不同,则函数结果仍为F。

> x<-1:2
> y<-c(1,2)
> identical(x,y)
[1] FALSE
> typeof(x)
[1] "integer"
> typeof(y)
[1] "double"

3.6 向量元素的名称

向量元素的命名及用名称访问向量元素

> x<-c(1,2,3)
> names(x)<-c("a","b","c")
> names(x)
[1] "a" "b" "c"
> names(x)<-NULL
> names(x)
NULL
> x<-c(1,2,3)
> names(x)<-c("a","b","c")
> x["a"]
a 
1 
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值