我是一名 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]))

但是如何使用公式来避免生日的巧合呢?

最佳答案

你可以这样做:

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 处给出了一个峰值,它们在处理零长度向量时比 : 更健壮。)

关于r - 在R中应用,如何使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18304672/

10-12 17:39