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)