-12
N=1000
alpha=0.1 

zerosandones = rbinom(N, 1,alpha)

vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))
vector1

densf=NULL
densft=NULL

for (i in (1:N))
{   
  if (zerosandones[i]==1 && vector1[i]=="raw") {densf[i] = 1} 
  else {if(zerosandones[i]==1 && vector1[i]=="cooked") {densft[i] <- rbinom(1, 1,alpha*0.2)}
  else {if (zerosandones[i]==0 && vector1[i]=="raw") {densf[i]=0} 
  else {if (zerosandones[i]==0 && vector1[i]=="cooked") {densft[i]=0}}}}}
densft
densf

嘿伙计,

我是 R 新手,正在构建定量风险评估模型。简单地说,这里的想法是我们生成一个 1000 个 0 和 1 的样本,每个 0,1 都有一个生/熟相关联。所有 0 都被丢弃,我们进一步分析 1。因此,例如,如果有一个 1 并且它的 raw 那么新的 densf 应该等于 1 否则 0。类似地,如果有一个 1 并且它的熟的那么新的 densft 应该等于 1(基于二项式 rv 与在上述情况下,alpha 为 0.02,否则为 0。

也就是说,我需要一些帮助,因为“densf”和“densft”会产生一堆NaN值,将 0 和 1 放在错误的位置。请帮忙!

4

2 回答 2

7

Here's an efficient vectorized solution:

N=1000
alpha=0.1 
zerosandones = rbinom(N, 1,alpha)
vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))

# new code:
densf <- as.integer(zerosandones & vector1 == "raw")
densft <- (zerosandones & vector1 == "cooked") * rbinom(N, 1, alpha*0.2)
于 2013-01-24T14:03:17.673 回答
3

学习 R 编程时,最重要的事情之一是考虑向量操作而不是循环。您在两个向量中得到NAs (与NaNR 中的不同),因为您没有填充所有位置:您只填充了densf您拥有的位置和您拥有"raw"的位置。你想让 R 用什么来填充其余的空间?是默认值,但如果需要,您可以用其他内容(例如零)填充它们。这就是我在下面所做的。densft"cooked"NA

# your code
N=1000
alpha=0.1 

zerosandones = rbinom(N, 1,alpha)

vector1=sample(c("raw","cooked"),1000,T,prob=c(0.12,.88))

# my code
densf <- ifelse(zerosandones == 1 & vector1 == "raw", 1, 0)
densft <- ifelse(zerosandones == 0 & vector1 == "raw", rbinom(N, 1,alpha*0.2), 0)

注意事项:

  • 的使用ifelse,它是 的矢量化形式if
  • 的使用&,它是 的矢量化形式&&
  • 没有循环!R中的循环很慢。考虑向量需要一些调整,但几乎总是更好。

当我运行这个时,我得到了 12 个densf和 3 个densft,这是我所期望的。如果这不是所期望的,那么您需要更好地解释您在这里尝试做什么以及为什么您期望不同的东西。

于 2013-01-24T13:49:44.527 回答