Как создать функцию подбрасывания монеты R - PullRequest
2 голосов
/ 29 марта 2020

Я пытаюсь создать функцию в 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)
}

Но это не удается, и я не знаю, как создать стол

1 Ответ

3 голосов
/ 29 марта 2020

R является векторизованным языком, поэтому во многих случаях отпадает необходимость в al oop. Таким образом, вместо цикла m раз, просто выберите m выборок из 0 или 1. Это значительно улучшит производительность.

Кроме того, постепенное добавление в вектор или фрейм данных с функцией связывания внутри al oop происходит медленно в R, поскольку при каждом вызове функции создается новая копия информации.

Take посмотрите на этот упрощенный код:

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)
...