【问题标题】:How to create function of tossing coin R如何创建抛硬币功能R
【发布时间】:2020-07-09 15:14:37
【问题描述】:

我正在尝试在 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 arrays sorting probability


    【解决方案1】:

    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)
    

    【讨论】:

    • 但是如何统计出现的“Heads”数量?
    • 如果对各列求和,则会提供出现的正面数量。 (coin1+coin2) 将两个向量逐个元素相加。希望这能回答您的问题。
    • 你所做的很棒,但我想问一下如何将那个“0”、“1”替换为“头”、“尾”,结果和你一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多