【问题标题】:Two loops and presentation of answer in a simple distribution format两个循环并以简单的分布格式呈现答案
【发布时间】:2019-09-28 09:21:32
【问题描述】:

有 10 个家庭。当他们生下一个男孩时,他们就停止了。当他们有一个女孩时,他们会继续生孩子。男孩和女孩的比例是多少?我有能力做这部分。代码如下。

N <- 10
boys <- 0
girls <- 0
while (N>=1) {
  boyorgirl <- sample (c("boy", "girl"), N, replace = TRUE)   
  boys <- boys + length(which(boyorgirl=="boy"))
  girls <- girls + length(which(boyorgirl=="girl"))
  N <- length(which(boyorgirl=="girl"))
}
ratioboygirl <- boys / girls

当我必须为 1000 个不同的家庭重复 1000 次时,我的问题就出现了。我应该得到 1000 个不同比例的男孩:女孩,然后列出这 1000 个比例的分布以便于查看。

我自己的尝试如下。该代码不起作用,它也不包括将最后的 1000 个比率以简单的分布格式放置以便于查看。

boys <- list()
girls <- list()
ratioboygirl <- list()

for (ii in 1:1000) {
  boys[ii] <- 0
  girls[ii] <- 0
  N <- 10
  while (N>=1) {
    boyorgirl <- sample (c("boy", "girl"), N, replace = TRUE)   
    boys[ii] <- boys[ii] + length(which(boyorgirl=="boy"))
    girls[ii] <- girls[ii] + length(which(boyorgirl=="girl"))
    N <- length(which(boyorgirl=="girl"))
  }
  ratioboygirl[ii] <- boys [ii] / girls [ii]
}

【问题讨论】:

    标签: r


    【解决方案1】:

    由于您将boys、girls 和ratioboygirl 初始化为lists,因此您需要使用双括号[[]] 传递单个数字,而不是使用单括号[] 传递一个列表。您可以使用一个简单的示例来验证这一点。

    a <- list(1,2,3)
    a[1] + a[2]
    #Error in a[1] + a[2] : non-numeric argument to binary operator
    a[[1]] + a[[2]]
    #[1] 3
    

    您还可以使用str(a[1] + a[2]) 和str(a[[1]] + a[[2]]) 查看每个返回的内容。第一个返回list,而第二个返回num。同样,您可以按如下方式修改代码以获得所需的输出。 unlist 将list 的输出转换为num,以产生与您的第一个脚本类似的输出。

    set.seed(777)
    
    boys <- list()
    girls <- list()
    ratioboygirl <- list()
    
    for (ii in 1:10) {
      boys[[ii]] <- 0
      girls[[ii]] <- 0
      N <- 10
      while (N>=1) {
        boyorgirl <- sample (c("boy", "girl"), N, replace = TRUE)   
        boys[[ii]] <- boys[[ii]] + length(which(boyorgirl=="boy"))
        girls[[ii]] <- girls[[ii]] + length(which(boyorgirl=="girl"))
        N <- length(which(boyorgirl=="girl"))
      }
      ratioboygirl[[ii]] <- boys [[ii]] / girls [[ii]]
    }
    ratioboygirl_out<- unlist(ratioboygirl)
    
    # ratioboygirl_out
    #[1] 0.5263158 0.6250000 2.5000000 2.5000000 1.6666667 0.5555556 0.7692308
    # [8] 0.6250000 0.7692308 0.8333333
    

    把10改成你喜欢的号码(1000)。

    【讨论】:

    • 我将根据我自己的问题使用直方图函数来完成输出。感谢 deepseefan 的建议。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多