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。因此,例如,如果有一个和它的原始然后新的densf应该等于1,否则为0.同样,如果有一个并且它已经煮熟,那么新的densft应该等于1(基于二项式rv模拟一个在上述情况下,α为0.02,否则为0.
那就是说,我需要一些帮助,因为“densf”和“densft”会产生一堆NaN
值,将0和1放在错误的位置。请帮忙!
答案 0 :(得分:7)
这是一个有效的矢量化解决方案:
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)
答案 1 :(得分:3)
在R中学习编程时最重要的事情之一就是考虑向量运算而不是循环。您在两个向量中得到NA
s(与R中的NaN
不同),因为您没有填充所有位置:您只填充densf
中的位置您拥有"raw"
以及densft
中"cooked"
所在地的位置。你想让R用其他空间填充什么? 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
。&
,&&
。当我跑步时,densf
中有12个,densft
中有3个,这与我的预期相符。如果这不是你期望的那样,那么你需要更好地解释你在这里尝试做什么,以及为什么你期望不同的东西。