-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 に raw/cooked が関連付けられているという考えです。すべての 0 が削除され、さらに 1 が分析されます。したがって、たとえば、1 があり、その raw がある場合、新しい densf は 1 に等しい必要があります。それ以外の場合は 0 です。上記の場合はアルファ 0.02、そうでない場合は 0。

とはいえ、「densf」と「densft」が一連のNaN値を生成し、0 と 1 を間違った場所に配置するので、助けが必要です。助けてください!

4

2 に答える 2

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)
于 2013-01-24T14:03:17.673 に答える
3

R でのプログラミングを学習する際に最も重要なことの 1 つは、ループではなくベクトル操作の観点から考えることです。すべての場所を埋めているわけではないため、2 つのベクトルでNAs (R​​ と同じではありません)を取得しています。R に残りのスペースを何で埋めてもらいたいですか? がデフォルトですが、必要に応じて別のもの (ゼロなど) で埋めることができます。それが私が以下で行ったことです。NaNdensf"raw"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 に答える