R Learnilng 十八讲13-17

0013-选择结构

1. 条件表达式if

x <- 24
if(x%%2==0) print("偶数")

## [1] "偶数"

 

 

x <- 23
if(x%%2==1) print("奇数")

## [1] "奇数"

 

 

x <- 24
y <- 9
if(x>y) print("x>y")

## [1] "x>y"

 

 

if(x<y) print("x<y")

a <- sample(1:10, 5)
a

## [1] 6 10 3 8 5

 

 

if(a>5) a=0

## Warning in if (a > 5) a = 0: 条件的长度大于一,因此只能用其第一元素

a

## [1] 0

 

 

x <- 6
if(x>0){
print(x)
print("当前数值大于0")
}

## [1] 6
## [1] "当前数值大于0"

 

 

x <- 6
if(x>0) print("x>0") else print("x<=0")

## [1] "x>0"

 

 

x <- -9
if (x>0) print("x>0") else print("x<0")

## [1] "x<0"

 

 

a <- runif(1,1,10)
b <- runif(1,1,10)
if (a>b){
print("a>b")
}else{
print("a<=b")
}

print("test")

## [1] "a>b"

## [1] "test"

2. if…else的简化版ifelse函数

x <- 3
y <- ifelse(x>0,x,-x)
y

## [1] 3

 

 

x <- -3
y <- ifelse(x>0,x,-x)
y

## [1] 3

 

 

x <--3
y <- ifelse(x>0,"x>0",ifelse(x==0,"x=0","x<0"))
y

## [1] "x<0"

 

 

x <- c("合格","不合格","淘汰","残次品","次品","合格")
b <- ifelse(x=="合格","合格","次品")
b

## [1] "合格" "次品" "次品" "次品" "次品" "合格"

 

 

3. 多分支选择结构if_else_if_else…

x <- c("tianjin","guangzhou","beijing")
if ("Tianjin" %in% x){
print("Tianjin exist")
}else if("tianjin" %in% x){
print("tianjin exist")
}else{
print("nothing to find")
}

## [1] "tianjin exist"

 

 

4. switch结构

switch(1, mean(1:10), rnorm(4)) # 执行mean(1:10)

## [1] 5.5

 

 

switch(2, mean(1:10), rnorm(4)) # 执行rnorm(4)

## [1] -0.5767823 -1.1685063 0.8742913 -0.6632414

 

 

x <- 2
switch(x, "tianjin","beijing","guangzhou")

## [1] "beijing"

 

 

a <- sample(-10:10,5)
a

## [1] -1 -4 -7 8 4

 

 

switch(1,a,0,-a)

## [1] -1 -4 -7 8 4

 

switch (2,a,0,-a)

## [1] 0

 

switch(3,a,0,-a)

## [1] 1 4 7 -8 -4

0014-循环结构

1. for循环

for (word in c("li","li","zong")){
print(word)
}

## [1] "li"
## [1] "li"
## [1] "zong"

 

 

for (i in 1:10){
print(i)
}

## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

 

 

for (i in 1:10){
cat(i)
}

## 12345678910

 

 

for (i in 1:10){
print(1:i)
}

## [1] 1
## [1] 1 2
## [1] 1 2 3
## [1] 1 2 3 4
## [1] 1 2 3 4 5
## [1] 1 2 3 4 5 6
## [1] 1 2 3 4 5 6 7
## [1] 1 2 3 4 5 6 7 8
## [1] 1 2 3 4 5 6 7 8 9
## [1] 1 2 3 4 5 6 7 8 9 10

 

 

for (i in 1:10){
cat(1:i)
}

## 11 21 2 31 2 3 41 2 3 4 51 2 3 4 5 61 2 3 4 5 6 71 2 3 4 5 6 7 81 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9 10

 

 

for (i in 1:10){
cat(1:i)
cat("\n")
}

## 1
## 1 2
## 1 2 3
## 1 2 3 4
## 1 2 3 4 5
## 1 2 3 4 5 6
## 1 2 3 4 5 6 7
## 1 2 3 4 5 6 7 8
## 1 2 3 4 5 6 7 8 9
## 1 2 3 4 5 6 7 8 9 10

 

 

a <- vector(length = 10)
a

## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

a <- c(1:10)
for (i in 1:10){
a[i] <- a[i] * 10
}
a

## [1] 10 20 30 40 50 60 70 80 90 100

 

 

for (i in seq(from=5, to=25, by=5)){
print(i)
}

## [1] 5
## [1] 10
## [1] 15
## [1] 20
## [1] 25

 

 

for (i in seq(from=5, to=25, by=5)){
cat(i," ")
}

## 5 10 15 20 25

 

 

for (i in seq(from=5, to=25, by=5)){
cat(i^2, "~~~")
}

## 25 ~~~100 ~~~225 ~~~400 ~~~625 ~~~

 

 

2. 斐波那切数列的实现

num.fibs <- 50
r = numeric(num.fibs)
r[1] = 1
r[2] = 1
for (i in 3:num.fibs){
r[i] = r[i-1] + r[i-2]
}
r

## [1] 1 1 2 3 5 8
## [7] 13 21 34 55 89 144
## [13] 233 377 610 987 1597 2584
## [19] 4181 6765 10946 17711 28657 46368
## [25] 75025 121393 196418 317811 514229 832040
## [31] 1346269 2178309 3524578 5702887 9227465 14930352
## [37] 24157817 39088169 63245986 102334155 165580141 267914296
## [43] 433494437 701408733 1134903170 1836311903 2971215073 4807526976
## [49] 7778742049 12586269025

 

 

3. max与min的算法实现

a <- sample(10:99,10)
a

## [1] 37 94 93 31 43 44 66 21 54 27

 

myMax = a[1]
for (i in 2:length(a)) {
if (a[i]>myMax){
myMax=a[i]
}
}
myMax

## [1] 94

 

 

myMin = a[1]
for (i in 2:length(a)) {
if (a[i]<myMin){
myMin=a[i]
}
}
myMin

## [1] 21

 

 

4. 循环遍历matrix矩阵

a <- matrix(nrow = 5, ncol = 6)
a

## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] NA NA NA NA NA NA
## [2,] NA NA NA NA NA NA
## [3,] NA NA NA NA NA NA
## [4,] NA NA NA NA NA NA
## [5,] NA NA NA NA NA NA

 

 

n <-1
for (i in 1:5){
for (j in 1:6){
a[i,j] <-n
n <- n +1
}
}
a

## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
## [4,] 19 20 21 22 23 24
## [5,] 25 26 27 28 29 30

 

 

5. 九九乘法表cat练习

for (i in 1:9){
for (j in 1:i){
cat(i*j," ")
}
cat("\n")
}

## 1
## 2 4
## 3 6 9
## 4 8 12 16
## 5 10 15 20 25
## 6 12 18 24 30 36
## 7 14 21 28 35 42 49
## 8 16 24 32 40 48 56 64
## 9 18 27 36 45 54 63 72 81

 

 

for (i in 1:9){
for (j in 1:i){
cat(j," ")
}
cat("\n")
}

## 1
## 1 2
## 1 2 3
## 1 2 3 4
## 1 2 3 4 5
## 1 2 3 4 5 6
## 1 2 3 4 5 6 7
## 1 2 3 4 5 6 7 8
## 1 2 3 4 5 6 7 8 9

 

 

for (i in 1:9){
for (j in 1:i){
cat(j,"x",i,"=",i*j,"\t")
}
cat("\n")
}

## 1 x 1 = 1
## 1 x 2 = 2 2 x 2 = 4
## 1 x 3 = 3 2 x 3 = 6 3 x 3 = 9
## 1 x 4 = 4 2 x 4 = 8 3 x 4 = 12 4 x 4 = 16
## 1 x 5 = 5 2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25
## 1 x 6 = 6 2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
## 1 x 7 = 7 2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42 7 x 7 = 49
## 1 x 8 = 8 2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48 7 x 8 = 56 8 x 8 = 64
## 1 x 9 = 9 2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54 7 x 9 = 63 8 x 9 = 72 9 x 9 = 81

 

 

6. while循环

a <- 10
while (a<14) {
print(a)
a <- a + 1
}

## [1] 10
## [1] 11
## [1] 12
## [1] 13

 

 

a <- 10
while (a != 0) {
a <- a - 1
cat("倒数",a,"秒!\n")
}
print("START")

## 倒数 9 秒!
## 倒数 8 秒!
## 倒数 7 秒!
## 倒数 6 秒!
## 倒数 5 秒!
## 倒数 4 秒!
## 倒数 3 秒!
## 倒数 2 秒!
## 倒数 1 秒!
## 倒数 0 秒!
## [1] "START"

7. repeat语句-使用频率较低

repeat要结合if和break使用 repeat不遇到break就一直循环下去

f = 1
f[2] = 1
i = 1
repeat{
f[i+2] = f[i] + f[i+1]
i = i + 1
if (i > 30)
break
}
f

## [1] 1 1 2 3 5 8 13 21 34
## [10] 55 89 144 233 377 610 987 1597 2584
## [19] 4181 6765 10946 17711 28657 46368 75025 121393 196418
## [28] 317811 514229 832040 1346269 2178309

 

0015-函数

1. 函数的基础

a = 10
b = 10
f <- function(x,y){
x+y
}
c <- f(a,b)
c

## [1] 20

 

2. 默认参数

f <- function(x,y){
x+y
}
f(1,2)

## [1] 3

# f(1)

定义几个参数就需要写几个值进去,或者可以补充默认值

3. 任意个参数

f <- function(...){
a = list(...)
for (i in a)
cat(i,"\n")
}
f(31231,12313123,51314,1231341)

## 31231
## 12313123
## 51314
## 1231341

 

f <- function(w,...){
a = list(...)
w = w*w
cat(w,"\n")
for (i in a)
cat(i,"\n")
}
f(9,12313123,51314,1231341)

## 81
## 12313123
## 51314
## 1231341

4. 关于return的细节

f <- function(x){
return(x^2 + 3)
}
f(5)

## [1] 28

 

f <- function(x){
x^2 + 3
}
f(5)

## [1] 28

所以区别是什么呢? 没啥特别的区别~

但是function区块的代码,一旦遇到return就终止函数开始返回值,这可以算一个区别

 

r <- function(a){
if (a>0) return(a) else return(a*a)
}
r(2)

## [1] 2

 

r(-4)

## [1] 16

5. sapply函数

a <- c(1:7)
sqrt(a)

## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751

a <- c(1:7)
sapply(a,sqrt)

## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751

sapply函数类似pandas的map,sapply的输入函数也可以使用function自定义函数

0016-向量案例集

1. 睡眠时间

  • 例题: 统计某校小学生的睡眠时间,如果睡眠时间小于10小时,则认为睡眠时间是不足的. 睡眠时间如下, 统计睡眠不足的学生人数 10, 9, 10, 8, 8, 13, 10, 10, 10, 12

a <- c(10, 9, 10, 8, 8, 13, 10, 10, 10, 12)
sum(a<10)

## [1] 3

  • 例题: 接着上体,取出小学生睡眠时间的中位数, 并将低于中位数的时间筛选出来

median(a)

## [1] 10

a[a<median(a)]

## [1] 9 8 8

此外还可以使用which函数来求解

a <- c(10, 9, 10, 8, 8, 13, 10, 10, 10, 12)
which(a<median(a))

## [1] 2 4 5

a[which(a<median(a))]

## [1] 9 8 8

2. 判断逻辑

  • 例题: 某原件的硬度单位应该在6~16之间,如果不在这个区间则被认为过软或过硬,是不合格的,某样本分布如下,判断不合格产品数 7, 9, 14, 15, 12, 11, 5, 17, 18, 10

a <- c(7, 9, 14, 15, 12, 11, 5, 17, 18, 10)
b <- a[a<6 | a>16]
length(b)

## [1] 3

3. 取子集

  • 例题: 取前五个数和后五个数分别计算平均值 16, 18, 19, 20, 21, 22, 24, 27, 28, 30

a <- c(16, 18, 19, 20, 21, 22, 24, 27, 28, 30)
mean(a[1:5])

## [1] 18.8

mean(a[6:10])

## [1] 26.2

3. data()函数的使用

data()

输入这个命令就会跳出当前可用数据集 然后选择一个数据集使用how()来查看更多信息

  • 例题: R语言内置了precip数据集, 是美国70个城市的降雨量信息

?precip

输入上面这个命令会在Rstudio右下角的框框中显示这个数据集的信息

precip

## Mobile Juneau Phoenix Little Rock
## 67.0 54.7 7.0 48.5
## Los Angeles Sacramento San Francisco Denver
## 14.0 17.2 20.7 13.0
## Hartford Wilmington Washington Jacksonville
## 43.4 40.2 38.9 54.5
## Miami Atlanta Honolulu Boise
## 59.8 48.3 22.9 11.5
## Chicago Peoria Indianapolis Des Moines
## 34.4 35.1 38.7 30.8
## Wichita Louisville New Orleans Portland
## 30.6 43.1 56.8 40.8
## Baltimore Boston Detroit Sault Ste. Marie
## 41.8 42.5 31.0 31.7
## Duluth Minneapolis/St Paul Jackson Kansas City
## 30.2 25.9 49.2 37.0
## St Louis Great Falls Omaha Reno
## 35.9 15.0 30.2 7.2
## Concord Atlantic City Albuquerque Albany
## 36.2 45.5 7.8 33.4
## Buffalo New York Charlotte Raleigh
## 36.1 40.2 42.7 42.5
## Bismark Cincinnati Cleveland Columbus
## 16.2 39.0 35.0 37.0
## Oklahoma City Portland Philadelphia Pittsburg
## 31.4 37.6 39.9 36.2
## Providence Columbia Sioux Falls Memphis
## 42.8 46.4 24.7 49.1
## Nashville Dallas El Paso Houston
## 46.0 35.9 7.8 48.2
## Salt Lake City Burlington Norfolk Richmond
## 15.2 32.5 44.7 42.6
## Seattle Tacoma Spokane Charleston Milwaukee
## 38.8 17.4 40.8 29.1
## Cheyenne San Juan
## 14.6 59.2

这样就显示了70个city的降雨量信息

我们取出所有城市的名称

for (i in names(precip)){
cat(i,"\t")
}

## Mobile Juneau Phoenix Little Rock Los Angeles Sacramento San Francisco Denver Hartford Wilmington Washington Jacksonville Miami Atlanta Honolulu Boise Chicago Peoria Indianapolis Des Moines Wichita Louisville New Orleans Portland Baltimore Boston Detroit Sault Ste. Marie Duluth Minneapolis/St Paul Jackson Kansas City St Louis Great Falls Omaha Reno Concord Atlantic City Albuquerque Albany Buffalo New York Charlotte Raleigh Bismark Cincinnati Cleveland Columbus Oklahoma City Portland Philadelphia Pittsburg Providence Columbia Sioux Falls Memphis Nashville Dallas El Paso Houston Salt Lake City Burlington Norfolk Richmond Seattle Tacoma Spokane Charleston Milwaukee Cheyenne San Juan

下面我们想看第十个元素是啥

precip[10]

## Wilmington
## 40.2

反过来

precip["Wilmington"]

## Wilmington
## 40.2

0017-抛硬币试验

1. 抛硬币的概率实验

  • 例题: 分别抛三枚硬币, 三枚硬币的图案可能使一样的,也可能是不一样的, 一样的老板给你3元,不一样你给老板3元,这个游戏公平吗?

显然不公平对吧? 同正或同反的概率是1/2 * 1/2 * 1/2 * 2 = 1/4, 这个游戏肯定玩过来是老板赚钱, 但是如果用R去算应该如何算呢?

假如我们玩100次游戏,0代表正面,1代表反面,那么同为0或同为1时是我们赢了,其他是输了,我们能赢或者输多少钱呢,100000次呢?

a <- sample(c(0,1), 3, rep=T)
a

## [1] 0 1 0

可以算sum值,如果是0说明同为正面,3说明同为反面,1或2说明我们输了

sum(a)

## [1] 1

 

我们重复100次

money = 0
for (i in 1:100){
a = sample(c(0,1), 3, rep=T)
if (sum(a)==0 | sum(a)==3){
money = money + 3
}else{
money = money -3
}
}
money

## [1] -150

 

money = 0
for (i in 1:100000){
a = sample(c(0,1), 3, rep=T)
if (sum(a)==0 | sum(a)==3){
money = money + 3
}else{
money = money -3
}
}
money

## [1] -149514

 

2. 接下来我们用table函数来看a的分布情况

mySum <- c()
for (i in 1:1000){
a <- sample(c(0,1), 3, replace=T)
mySum <- c(mySum,sum(a))
}
mySum

## [1] 2 2 2 1 3 2 2 3 1 3 2 3 2 2 1 1 0 1 2 0 2 3 1 0 2 1 1 2 2 2 3 0 3 0 0 1 2
## [38] 1 2 1 1 2 1 3 2 0 0 2 1 3 0 1 1 3 1 3 2 2 2 1 1 1 1 1 3 2 1 1 1 3 1 2 3 1
## [75] 1 1 2 2 0 1 1 3 2 1 2 2 2 1 2 0 2 2 1 2 1 2 3 1 3 1 2 0 1 2 3 1 2 2 0 3 0
## [112] 0 1 1 0 2 2 2 2 1 1 1 0 0 1 2 2 1 2 2 3 1 1 2 2 2 2 1 0 1 3 1 1 3 2 3 3 1
## [149] 3 2 1 2 1 1 2 1 2 3 2 2 0 3 1 2 2 2 3 0 0 1 2 1 2 1 1 1 1 1 2 0 1 3 2 2 3
## [186] 2 1 1 2 2 1 2 1 3 2 3 1 3 1 1 2 1 1 1 1 2 1 2 1 1 2 1 1 1 2 2 2 2 1 1 0 2
## [223] 1 1 1 1 2 3 1 0 0 1 1 1 2 2 3 1 2 3 1 2 1 3 1 1 3 1 1 3 2 2 2 1 1 2 2 0 1
## [260] 1 1 2 1 1 3 0 3 1 1 0 2 2 0 0 1 1 2 1 1 3 1 2 2 1 1 2 1 1 2 1 2 1 1 1 1 1
## [297] 1 2 3 1 0 1 1 1 0 2 3 2 1 2 1 0 2 2 2 1 2 1 1 1 1 1 2 2 1 1 1 0 2 0 0 1 0
## [334] 1 0 2 1 3 2 2 1 1 0 1 2 2 1 2 1 2 1 1 0 2 3 2 2 2 2 2 1 2 2 2 2 2 1 2 1 2
## [371] 1 3 1 1 1 0 1 1 1 2 1 0 1 2 2 3 1 3 0 1 3 2 1 2 1 1 1 2 1 1 1 3 2 3 1 2 2
## [408] 1 1 2 3 2 3 0 3 2 3 2 2 1 1 2 1 3 0 2 1 0 2 1 2 0 2 1 2 1 2 3 3 0 1 0 2 1
## [445] 2 2 1 1 2 1 1 2 2 1 3 1 3 3 0 1 3 3 2 2 1 1 1 1 1 2 0 1 1 2 2 2 2 3 3 1 3
## [482] 2 3 3 1 0 1 1 2 2 0 0 2 2 1 3 3 1 2 2 3 2 1 2 1 1 2 2 2 2 2 2 1 0 0 2 1 2
## [519] 0 2 0 1 3 2 2 2 1 1 2 1 0 1 1 1 2 1 0 2 2 0 2 0 2 1 2 2 2 3 1 1 1 0 1 2 2
## [556] 1 2 2 1 2 1 1 0 1 2 1 3 1 0 1 1 2 1 1 2 1 2 2 2 2 1 3 2 1 0 3 3 2 1 1 2 1
## [593] 3 1 3 2 1 0 1 0 2 1 1 1 0 1 3 1 0 2 1 0 1 1 2 1 1 1 2 1 2 0 1 0 1 2 2 3 2
## [630] 1 2 0 2 2 2 2 2 2 2 1 2 1 3 0 3 0 0 1 2 1 1 2 2 0 2 2 2 2 2 1 1 1 1 2 2 1
## [667] 1 1 1 2 2 1 2 1 1 2 1 3 1 1 1 1 1 3 1 1 1 1 2 2 1 2 0 1 2 2 0 1 2 2 2 1 1
## [704] 0 1 3 0 1 0 1 1 2 1 3 2 1 2 2 1 2 2 1 1 2 2 0 1 2 0 1 1 3 2 0 3 2 2 2 1 2
## [741] 2 0 2 0 2 2 1 1 2 2 1 1 2 2 1 1 2 1 2 2 2 2 1 3 2 2 0 1 1 2 1 2 2 2 3 1 2
## [778] 2 3 2 0 2 1 1 1 1 1 2 2 2 0 2 1 2 0 1 3 2 1 2 1 1 2 3 3 0 1 2 0 2 2 1 1 2
## [815] 0 2 2 3 3 1 1 0 2 2 2 2 1 1 1 2 1 2 1 0 2 2 1 1 2 0 1 2 1 0 0 1 2 3 2 2 2
## [852] 2 2 2 1 1 2 1 1 2 0 1 2 1 1 1 2 2 1 2 2 2 1 2 3 2 1 1 1 1 1 1 0 0 0 1 1 2
## [889] 0 1 3 2 2 0 3 2 1 1 2 3 3 1 2 2 1 0 1 1 1 1 0 0 1 1 2 3 0 0 1 2 2 0 0 2 1
## [926] 1 2 2 2 3 1 1 2 0 1 0 0 2 1 2 2 2 3 1 3 2 1 2 1 2 1 2 1 2 2 1 0 0 2 3 2 3
## [963] 2 2 1 2 2 3 2 1 2 1 2 2 2 3 0 1 2 2 2 2 0 1 2 1 2 2 3 2 1 2 0 1 0 1 2 0 2
## [1000] 1

 

table(mySum)

## mySum
## 0 1 2 3
## 124 389 374 113

 

所以table函数的功能是查看向量中值的分布情况 近似的去看也就是赚钱概率为(146+104)/1000 = 0.230 和理论预期值0.25相差不多,如果我们重复次数更多,就会更接近0,25

下面我们去访问table这个对象

x <- table(mySum)
x

## mySum
## 0 1 2 3
## 124 389 374 113

 

x["0"] # 这是使用名称进行访问

## 0
## 124

 

x[1] # 这是使用索引进行访问

## 0
## 124

3. table转Dataframe

x

## mySum
## 0 1 2 3
## 124 389 374 113

df <- as.data.frame(x)
df

## mySum Freq
## 1 0 124
## 2 1 389
## 3 2 374
## 4 3 113

后面就也可以使用Dataframe的逻辑来进行运算

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值