在R中嬉戏,怎么用?

时间:2013-08-18 23:35:10

标签: r sapply

我是C ++程序员,我是R的新手。有人告诉我在R中使用for循环是一个坏主意,最好使用sapply。我编写了以下代码来计算birthday coincidence的概率:

prob <- 1           # prob of no coincidence
days <- 365 
k <- 50             # how many people
probability <- numeric()  #probability vector (empty right now)
for(i in 1:k){
    prob <- (days - i + 1)/days * prob # Formula for no coincidence
    probability[i] <- 1 - prob
}

我如何使用sapply做同样的事情?我想做点什么:

1 - sapply(1:length(m), function(x) prod(m[1:x]))

但如何使用这个公式并不是生日的巧合?

2 个答案:

答案 0 :(得分:6)

你可以这样做:

m <- (days - seq_len(k) + 1) / days
probability <- 1 - sapply(seq_along(m), function(x) prod(m[1:x]))

但在有用的cumprod函数中会遗漏:

probability <- 1 - cumprod(m)

会更快。

(同时在seq_alongseq_len给出了一个峰值,它在处理零长度向量时比:更强大。)

答案 1 :(得分:4)

对于您的具体问题,最好只使用内置的生日概率计算器

sapply(1:50, pbirthday)