r - 如何创建抛硬币功能R
问题描述
我正在尝试在 R 中创建一个函数来模拟将四枚硬币掷出 m 次的实验,每个实验记录每个硬币上“数字”或“图像”的外观。
以表格形式呈现m个实验的结果,并在表格的最后一列加上“出现数的边数”。
Sim_Coin<-function(m){
c1<-c()
c2<-c()
cs<-c()
for(i in 1:m)
{
c1<-rbind(d1,sample(0:1,size=1)
c2<-rbind(d2,sample(0:1,size=1)
}
cs<-c1+c2
v<-cbind(c1,c2,cs)
v<-as.data.frame(v)
names(v)<-c("coin1","coin2","sum")
return(v)
}
但它失败了,我不知道如何创建表
解决方案
R 是一种矢量化语言,因此在许多情况下可以避免循环。所以不要循环 m 次,只需从 0 或 1 中挑选 m 个样本。这将大大提高性能。
在循环内使用绑定函数逐步添加到向量或数据帧上,在 R 中也很慢,因为每个函数调用都会创建一个新的信息副本。
看看这个流线型代码:
Sim_Coin<-function(m){
coin1<-sample(c("head", "tail"), size=m, replace=TRUE)
coin2<-sample(c("head", "tail"), size=m, replace=TRUE)
v<-data.frame(coin1, coin2)
v$sum <- apply(v, 1, function(i){sum(i=="head")})
return(v)
}
Sim_Coin(3)
coin1 coin2 sum
1 tail tail 0
2 head head 2
3 tail head 1
由于您的问题涉及翻转 4 个硬币而不仅仅是 2 个,因此这是一个扩展版本:
Sim_Coin2<-function(m){
n<-4. #number of coins to flip
#create n vectors m long
coins<- lapply(1:n, function(i) {
sample(0:1, size=m, replace=TRUE)
})
#make data frame and rename columns
dfcoin<-as.data.frame(do.call(cbind, coins))
names(dfcoin)<-paste0("Coin", 1:n)
#calculate the number of heads by taking the sum of the rows
dfcoin$sum <- rowSums(dfcoin)
dfcoin
}
Sim_Coin2(10)
推荐阅读
- amazon-web-services - 为什么我通过 Chalice 的 Lambda API 会给出内部服务器错误而不是日期时间值?
- java - CheerpJ 可以在小程序框架外扩展 Java mouseDragged 操作吗?
- javascript - setState 在 ReactJS GET 方法中不起作用
- arkit - 如何使用带有 ARImageTrackingConfiguration 的 RealityKit ARView?
- java - 尝试学习 java、html、curl 或其他任何东西以学习如何自动与在线词典交互的新手
- python - 每个 epoch 后的 PyTorch 平均准确度
- python - 使用具有附加属性的自定义层保存和加载 keras 模型
- ruby - ruby heredoc 和 sprintf escape %: throwing malformed format sting %" (ArgumentError)
- java - 我的禁令命令参数要求似乎不起作用(Bukkit)
- javascript - 如何在按钮单击时将类添加到具有相同名称的 div