小心情
好几天没有学习了,最近在追《都挺好》,又把我一颗爱玩的心给激荡起来了,明明任务繁重,哎呦喂。学习吧,学习吧
复杂网络,时间序列,实习,事情还是蛮多的。
正文开始了
分支
- 逻辑运算符用在向量上,得到的也是向量
- 逻辑运算符得到的结果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语句
- 简单一个动作 ==> 如果饿了,就吃
- if(‘饿’){吃}
BTW 大括号可省略,eg: if(‘饿’) 吃- 如果这个动作的内容很丰富,大括号不可省
- 存在备选动作 ==> 如果饿了,就吃,否则就学习
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"
- 多个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")
}
}