R入门(五)---逻辑运算,if类语句

小心情

好几天没有学习了,最近在追《都挺好》,又把我一颗爱玩的心给激荡起来了,明明任务繁重,哎呦喂。学习吧,学习吧
复杂网络,时间序列,实习,事情还是蛮多的。

正文开始了

分支

  • 逻辑运算符用在向量上,得到的也是向量
  • 逻辑运算符得到的结果TRUE和FALSE,相当于数字1和0,可以对其进行数字运算
> TRUE*FALSE
[1] 0
> TRUE+TRUE
[1] 2
  • 常用的逻辑运算符
逻辑运算符含义
>大于
<小于
==等于
!=不等于
<=小于等于
>=大于等于
&
|

练习6.1 判断m中的元素是否在n中

> m <- 6:1
> n <- c(3,5,6)
> x <- numeric(length(m))
> for (i in 1:length(m)) {
+   x[i]=sum(m[i]==n)
+ }
> x
[1] 1 1 0 1 0 0
> x==0
[1] FALSE FALSE  TRUE FALSE  TRUE  TRUE

练习6.1 参考答案

> m <- 6:1
> n <- c(3,5,6)
> for (mi in m) print (mi == n )
[1] FALSE FALSE  TRUE
[1] FALSE  TRUE FALSE
[1] FALSE FALSE FALSE
[1]  TRUE FALSE FALSE
[1] FALSE FALSE FALSE
[1] FALSE FALSE FALSE

练习6.2 找出1:100中既能被2整除,也能被3整除的数

> y <- 1:100
> y[(y%%2==0)&(y%%3==0)]
 [1]  6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96

参考答案

#方案一
for (i in 1:100) {
  if(i %% 2 ==0 & i %% 3 == 0 ) print(i)
}
#方案二
seq(from=6,to = 100,by = 6)

练习6.3 找出1:10000中的素数(参考答案) 注意运算符号的先后顺序

z <- 2
for (i in 3:10000) {
  j  <-  2 : (i-1)
  if (sum(i %% j == 0) ==0)     z <- c(z,i)
}
z

高效tips x中的元素是否在y中出现:%in%

> x %in% y
[1]  TRUE  TRUE FALSE  TRUE FALSE FALSE
> x <- 1:3
> y <- c(4,1,2)
> x %in% y
[1]  TRUE  TRUE FALSE
> x[x %in% y]
[1] 1 2

> l <- c(5,8,6)
> k <- 3:5
> l %in% k
[1]  TRUE FALSE FALSE
> l[l %in% k]
[1] 5
> which(l %in% k)  #返回的是位数号
[1] 1

承接马尔萨斯人口增长模型,除了用locator()点击的方式来确定哪一年人口开始大于100亿之外,还可以用逻辑关系来显示

> r <- 0.011
> N <- numeric(100)
> N[1] <- 66.8
> for (i in 2:100) {
+   N[i] <- N[i-1]*r+N[i-1]
+ }
> N[N>100][1]
[1] 100.1312
> #画出增长模型
> y <- seq(from=2008,length.out = 100,by = 1)
> y[N>100][1]
[1] 2045
if语句
  1. 简单一个动作 ==> 如果饿了,就吃
  • if(‘饿’){吃}
    BTW 大括号可省略,eg: if(‘饿’) 吃
  • 如果这个动作的内容很丰富,大括号不可省
  1. 存在备选动作 ==> 如果饿了,就吃,否则就学习

if(‘饿’) {吃} else {学习}

  • 瘦身版
    ifesle(‘饿’,‘吃’,‘学习’)
  • 完整版只能判断length为1的向量,但瘦身版可用于长度大于1:
> x <- 60:70
> if (x < 75) {
+   print('small')
+ } else {
+   print('large')
+ }
[1] "small"
Warning message:
In if (x < 75) { :
  the condition has length > 1 and only the first element will be used
> ifelse(x<75,'small','large')
 [1] "small" "small" "small" "small" "small" "small" "small"
 [8] "small" "small" "small" "small"
  1. 多个if嵌套 ==> 如果饿了,就吃;否则如果渴了,就喝;否则,干活

if(‘饿’){‘吃’
} else if(‘渴’) {
‘喝’} else {‘干活’}

  • 瘦身版
    ifelse(‘饿’,‘吃’,ifelse(‘渴’,‘喝’,‘干活’))
  • 同理:完整版只能判断length为1的向量,但瘦身版可用于长度大于1:
> x <- 70:95
> if (x < 75) {
+   print('small')
+ } else if (x >90) {
+   print('large')
+ } else print('median')
[1] "small"
Warning message:
In if (x < 75) { :
  the condition has length > 1 and only the first element will be used
> ifelse(x<75,'small',ifelse(x > 90,'large','median'))
 [1] "small"  "small"  "small"  "small"  "small"  "median"
 [7] "median" "median" "median" "median" "median" "median"
[13] "median" "median" "median" "median" "median" "median"
[19] "median" "median" "median" "large"  "large"  "large" 
[25] "large"  "large" 

switch函数

switch(statement,list)

  • 如果,statement为数值,则返回list中对应statement的内容;如果,statement为字符,则搜索list对应statement的内容;
  • 如果数值超过list的长度,则返回NULL,或者不显示;
> switch(1,mean(1:10),"R",2+2)
[1] 5.5
> switch(2,mean(1:10),"R",2+2)
[1] "R"
> switch(4,mean(1:10),"R",2+2)
> switch("fruit", fruit = "banana", vegetable = "broccoli", meat = "beef")
[1] "banana"
  • 根据马尔萨斯人口增长模型,将人口数大于100字号选择2号,颜色为红色显示;否则就字号为1号,深绿。
N <- numeric(100)
N[1] <- 66.8
for (t in 1:99) N[t+1] <- N[t] + r *N[t]
Y <- seq(2008,length.out = 100)
plot(Y + 2007,y = N,xlab = 'Year',ylab = 'Population',
     cex = ifelse(N>=100,2,1),pch=16,type = "b",
     col = ifelse(N>= 100,'red','darkgreen'))

在这里插入图片描述

  • 计算2019:2026年的复活节(直接用扩展包吧,怎么算的弄不明白,也看不懂)
if(!require('timeDate')) install.packages('timeDate')
require('timeDate')
Easter(year = 2019:2026)
  • library和require都可以载入包,但二者存在区别。
    在一个函数中,如果一个包不存在,执行到library将会停止执行,require则会继续执行。
  • 根据包的有无来执行,见下方
if(require("lme4")){
    print("lme4 is loaded correctly")
} else {
    print("trying to install lme4")
    install.packages("lme4")
    if(require(lme4)){
        print("lme4 installed and loaded")
    } else {
        stop("could not install lme4")
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值