R 循环

循环(loop)是R用来重复完成某个任务的方法,让我们用score函数来解决一个实际问题。

老虎机程序模拟的是现实生活中一批颇具争议的老虎机,人们认为这批老虎机有作弊嫌疑。这批老虎机的返还率看似为40美分/美元,但是制造商却声称这批机器的返还率是 92美分/美元。可以用score精确计算出这批机器的返还率,也就是老虎机中奖金额的期望值。

1、期望值

一个随机事件的期望值可以看作某种加权平均值。它是该事件每一个可能=结果乘以权值后所得结果的总和,权值对应每一个可能结果出现的概率。E(x)=(x,P(x,))

die <- c(1,2,3,4,5,6)
E= 1*1/6+2*1/6+3*1/6+4*1/6+5*1/6+6*1/6
E


因此,掷一个均匀的骰子,其点数的期望值是3.5.这其实就是所有可能点数的平均值。

在计算这些期望值的时候,我们用了三步。

(1)列出所有可能出现的结果。
(2)决定每个可能结果对应的值(在这个例子中就是骰子的点数)
(3)计算每个可能结果出现的概率。

将第二步中的值乘以第三步中对应的概率,再加总即得到期望值。用这三个步骤可以计算出更加复杂的期望值。

比如,列出所有可能出现的结果。当你掷两个骰子时,总共有36种可能出现的点数组合。

2、expand.grid

R中expand的.grid函数可以方便快捷地写出n个向量元素的所有组合。比如说,要将两个骰子的所有点数组合都列出来,只需要将对象die的两个副本交给expand.grid即可。

 rolls<-expand.grid(die,die)


expand.grid会返回一个含有两个骰子所有可能点数组合的数据框。

比如,你可以列出三个骰子的所有点数组合,代码为:expand.grid(die,die,die)。

expand.grid中所有元素的所有可能组合。数据框中的每一个元素都对应一个组合。

列出两个骰子的点数组合之后,便可以进一步确定每一次掷骰子的总点数了,也就是两个骰子的点数之和。可以用R的元素方式执行来计算结果。

rolls$value<-rolls$Var1+rolls$Var2
rolls


n个独立随机事件同时发生的概率等于每个随机事件单独发生的概率的乘积。
P(A&B&C&…)=P(A)*P(B)*P©…

得到三个随机的形状:

get_symbols <- function(){whell <- c("DD","7","BBB","BB","B","C","0")sample(whell,size = 3,replace = TRUE,prob = c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))
}

首先,找到var1中所有点数对应的概率值。这可以通过如下的查找表方法得到。

prob<-c("1"=1/8,"2"=1/8,"3"=1/8,"4"=1/8,"5"=1/8,"6"=3/8)
prob
rolls$Var1
prob[rolls$Var1]
rolls$prob1<-prob[rolls$Var1]
head(rolls,3)

我们可以用同样的查找表方法找到Var2中点数对应的概率值。

rolls$prob2<-prob[rolls$Var2]

通过prob1和prob2相乘得到每个点数组合的概率值。

 rolls$prob<-rolls$prob1*rolls$prob2

现在已经有了每种组合及其对应的点数,以及每个点数组合对应的概率值,计算期望值就比较容易了。只需要将点数与对应的概率相乘再求和就可以得到期望值。

 sum(rolls$value*rolls$prob)

使用expand.grid函数,从以下这个向量wheel中取三个符号,生成一个数据框。要求该数据框包含所有可能的符号组合。

wheel<-c("DD","7","BBB","BB","B","C","0")

在调用expand.grid函数时,设置参数stringsAsFactors=FALSE,否则expand.grid会将所有可能的组合以因子的形式存储在数据框中,score函数将无法处理这种情况。

combos<-expand.grid(wheel,wheel,wheel,stringsAsFactors=FALSE)combos

查找Var1中所有值对应的概率,然后将概率值作为一个新列prob1添加combos到中.对Var2和Var3执行同样的操作,以生成新列prob2和prob3。
在查找表中使用R的取值记号得到想要的值。取值结果将和你所使用的索引值一一对应。

combos$prob1 <- prob[combos$Var1]
combos$prob2 <- prob[combos$Var2]
combos$prob3 <- prob[combos$Var3]
head(combos,5)


计算中将价格的函数:

score <- function(symbols){same <- symbols[1] == symbols[2] && symbols[2] == symbols[3]bars <- symbols %in% c("B","BB","BBB")if (same){payouts <- c("DD" = 100,"7" = 80,"BBB" = 40,"BB" = 25,"B" = 10, "C"=10,"0" = 0)prize <- unname(payouts[symbols[1]])}else if(all(bars)){prize <- 5}else{cherries <- sum(symbols == "C")prize <- c(0,2,5)[cherries + 1]}diamonds <- sum(symbols == "DD")prize * 2^ diamonds
}

计算每一种符号组合出现的总概率。将这些概率值存为combos的一列,并将该列命名为prob,然后进行检查。

可以通过R的元素方式执行一次性计算所有符号组合的概率。

combos$prob <- combos$prob1 * combos$prob2 * combos$prob3
head(combos)

所有可能的符号组合对应的概率值之和等于1,这意味着计算无误。

sum(combos$prob)

3、for循环

for循环可以重复运行某段代码一定的次数,重复次数取决于循环的输入中有多少个元素。用R的语法表述如下。

for(value in that){this
}

这里的that应该是一个对象集合(通常是一个包含数值或字符串的向量)。对于出现在that中的每一个值,for循环都会运行一遍位于两个大括号之间的代码。


for(value in c("My","first","for","loop")){print(value)}


小心选择循环符号
无论处于什么环境中,只要调用了循环语句,R就会在该环境中运行循环代码。如果循环使用了该环境中已经存在的对象名称,就会发生冲突。循环将使用它所创建的对象覆盖当前环境中已经存在的对象。对于值符号来说也是如此。

针对集合运行for 循环
在许多编程语言中,for循环是用来处理整数的,而不是处理集合。R的for循环不是针对整数序列运行,而是针对一个集合。

利用for循环计算combos的每一行对应的中奖金额
开始之前,先在combos中创建一个新列用来存储for循环的输出结果。

combos$prize <- NA
head(combos)


上面的代码创建了一个名为prize的新列,并且暂时用缺失值符号NA填满。虽然这里只用了一个NA赋值,但是R会利用其循环规则将该列的所有位置都填上NA。

编写一个for循环,对combos的343行都运行一遍score函数。该循环应该做到,针对combos第i行的前三个元素运行score函数,并且把结果存储在combos$prize的第i个位置。

for (i in 1:nrow(combos)){symbols <- c(combos[i,1],combos[i,2],combos[i,3])combos$prize[i] <- score(symbols)
}

期望值就等于combosprize所有值的加权平均值,权值为combosprize所有值的加权平均值,权值为combosprize所有值的加权平均值,权值为combosprob.期望值也就是老虎机的返还率。

sum(combos$prize*combos$prob)

处理钻石百搭符号函数

#处理百搭钻石符号score <- function(symbols){diamonds <- sum(symbols == "DD")cherries <- sum(symbols == "C")slots <- symbols[symbols != "DD"]same <- length(unique(slots)) == 1bars <- slots %in% c("B","BB","BBB")#分配奖金if (diamonds == 3){prize <- 100}else if (same){payouts <- c("DD" = 100,"7" = 80,"BBB" = 40,"BB" = 25,"B" = 10, "C"=10,"0" = 0)prize <- unname(payouts[slots[1]])}else if (all(bars)){prize <- 5}else if (cherries > 0){prize <- c(0,2,5)[cherries + diamonds + 1 ]}else{prize <- 0}#根据钻石数量奖金翻倍prize * 2^diamonds
}

**利用新版的score函数,再次计算老虎机的期望值。你可以使用现有的combos数据框,但是需要用for循环重新计算combos$prize列。
**

for (i in 1:nrow(combos)){symbols <- c(combos[i,1],combos[i,2],combos[i,3])combos$prize[i] <- score(symbols)
}

然后重新计算期望值。

sum(combos$prize*combos$prob)

4.while循环

while(condition){code}

while会在每一次循环之前重新运行condition,这是一个逻辑测试。如果对condition求值的结果为TRUE,while就会运行大括号内的代码段;如果对condition求值的结果为FALSE,while就会结束循环。

while循环可以做的事情包括运行不定次数的迭代过程,如计算老虎机用光你所有的钱需要多久(见下面的代码)。但是,从实际应用来看,while循环在中的使用率要明显低于for循环。

play <- function(){symbols <- get_symbols()print(symbols)score(symbols)
}
play_till_broke <- function(start_with){cash <- start_withn <- 0while (cash > 0){cash <- cash - 1 +play()n <- n+1}n
}play_till_broke(100)

5、repeat循环

repeat循环甚至比while循环还要初级。它会一直重复运行某段代码,直到你终止循环(通过按Esc键),或者是它遇到了break命令(用来强制终止程序运行的命令)。

可以用repeat循环重写上面的playstillbroke函数该函数用于计算玩老虎机需要多久用光所有的钱。


play_till_broke <- function(start_with){cash <- start_withn <- 0repeat{cash <- cash - 1 +play()n <- n+1if (cash <= 0){break}}n
}play_till_broke(100)

练习:

找出自带数据集airquality中Temp值大于80的Ozone、Temp列的值。

data <- airquality
data$Temp[data["Temp"] > 80]
data$Ozone[data["Temp"] > 80]

R语言之循环(解决老虎机钻石匹配所有符号问题)相关推荐

  1. r语言for循环的c(),R语言简单for循环(二)

    创建一个简单数据框 Sys.setlocale('LC_ALL','C') ## [1] "C" library(tidyverse) ## -- Attaching packag ...

  2. R语言match函数对象之间的匹配实战

    R语言match函数对象之间的匹配实战 目录 R语言match函数对象之间的匹配实战 #基本语法 #match函数 # 匹配两个向量

  3. R语言while循环计算圆周率

    R语言while循环计算圆周率 原理说明 计算圆周率的方法很多,在这里我们使用概率的方法来计算圆周率(蒙特卡洛法). 假设有一个正方形,以其一个顶点为圆心,正方形的边长为半径,画1/4圆.则可以在正方 ...

  4. R语言使用循环语句一次性画出多幅图

    R语言使用循环语句一次性画出多幅图 首先加载包,patchwork用来一个界面展示多幅图 具体的可以看这篇文章 library(ggplot2) library(patchwork) 以数据iris为 ...

  5. R语言使用MatchIt包进行倾向性匹配分析、使用match.data函数构建匹配后的样本集合、使用可视化分析检验倾向性评分匹配后样本中的所有协变量的平衡情况

    R语言使用MatchIt包进行倾向性匹配分析.使用match.data函数构建匹配后的样本集合.使用可视化分析检验倾向性评分匹配后样本中的所有协变量的平衡情况 目录

  6. R语言使用MatchIt包进行倾向性匹配分析(设置匹配方法为nearest,匹配倾向性评分最近的对照组和病例组,1:1配比)、使用match.data函数构建匹配后的样本集合

    R语言使用MatchIt包进行倾向性匹配分析(设置匹配方法为nearest,匹配倾向性评分最近的对照组和病例组,1:1配比).使用match.data函数构建匹配后的样本集合 目录

  7. R语言使用MatchIt包进行倾向性匹配分析、使用match.data函数构建匹配后的样本集合、通过分析不同分组对应的协变量的均值来判断倾向性评分匹配后样本中的所有协变量的平衡情况

    R语言使用MatchIt包进行倾向性匹配分析.使用match.data函数构建匹配后的样本集合.通过分析不同分组对应的协变量的均值来判断倾向性评分匹配后样本中的所有协变量的平衡情况 目录

  8. r语言for循环的c(),R语言中for循环的并行处理方式

    前言 本文用于记录笔者在将R语言中的for语句并行化处理中的一些问题. 实验 这里使用foreach和doParallel包提供的函数实现for语句的并行处理. for语句脚本 func return ...

  9. R语言FOR循环打印9*9乘法表

    R语言FOR循环打印9*9乘法表 算法原理 使用for循环打印99乘法表时,需要两重循环,第一重循环乘数,第二重循环表示被乘数,打印当乘数大于等于被乘数时的结果,并在每次第二重循环结束时换行. 代码和 ...

最新文章

  1. HarmonyOS UI开发 match_parent与match_content
  2. 3DsMax渲染插件VRay NEXT完整的视频指南
  3. 【11分钟训练完ImageNet】DNN训练再破纪录,1024 CPU Caffe开源
  4. ad输出光绘文件_90%的工程师容易忽视(一):PCB输出gerber文件,这样操作才正确!...
  5. U3D 编辑器中sceneview下相机操作相关
  6. Boost:can_require_concepr的使用测试程序
  7. [蓝桥杯][基础练习VIP]分解质因数
  8. [BZOJ3944] Sum
  9. python3中format方法_[翻译]python3中新的字符串格式化方法-----f-string
  10. 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)...
  11. oracle的al32utf8,oracle字符集修改(AL32UTF8-UTF8)
  12. marqueeview更改字体颜色_安卓手机上可以编辑字体的便签软件哪个好?
  13. 记录一个修复ubuntu系统主机前置耳机孔没有声音的方法
  14. 日本雅虎API电商接口获取方法 批量发布、订单获取、后台操作等
  15. 当cmd里安装不了Appium-Python-Client时,Requirement already satisfied: Appium-Python-Client in
  16. dubbo 2标签解析 ServiceBeanT 生产者服务暴漏过程
  17. 惠普暗影精灵II代pro进入biso
  18. uni-app时间格式转换
  19. a16z合伙人Chris Dixon:DeFi和NFT之后的下一波区块链应用浪潮可能是这些
  20. <华为VRP系统>ENSP模拟器安装:

热门文章

  1. 软件定义网络PART 4
  2. Unity简易实现角色脚下光圈
  3. BigDecimal 科学计数法转换 正负数转换
  4. oracle数据类型和Java类型之间的映射关系
  5. 时序预测 | MATLAB实现BiLSTM时间序列预测
  6. bat命令启动谷歌浏览器无痕模式
  7. 使用封装的API接口,在控制台输出undefined
  8. js java 图片上传_spring(java,js,html) 截图上传图片实例详解
  9. 常见加密算法特点及适用场景
  10. GauGAN v2:两个词生成风景画