Два цикла и представление ответа в простом формате распространения - PullRequest
1 голос
/ 28 сентября 2019

Есть 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 разных семей из 10. Мне нужно получить 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]
}

1 Ответ

0 голосов
/ 28 сентября 2019

Поскольку вы инициализировали 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...