これだとエラーなんだよね
theta <- 0.6
lambda <- 3.5
N <- 10
sample <- data.frame(FLG= rbinom(N,size=1, prob = theta) )
sample %>%
mutate(value = if_else(FLG==0, 0, rpois(1,lambda)))
エラーの内容が
エラー: Problem with `mutate()` column `value`.
ℹ `value = if_else(FLG == 0, 0, rpois(1, lambda))`.
x `false` must be a double vector, not an integer vector.
とあるから,mutate
のところでうまくいってないのは明らか。
しかも,false
がdoubleのベクトル出ないとダメだ,整数ベクトルじゃないか,という話。
試しにポアソンじゃなくて正規分布で乱数発生させると,通るには通るんですよね。
sample %>%
mutate(value = if_else(FLG==0, 0, rnorm(1,lambda,1)))
でもこれだと,行ごとに乱数が出ているわけじゃなさそう。
> sample %>%
+ mutate(value = if_else(FLG==0, 0, rnorm(1,lambda,1)))
FLG value
1 1 3.607727
2 1 3.607727
3 1 3.607727
4 0 0.000000
5 0 0.000000
6 1 3.607727
7 1 3.607727
8 0 0.000000
9 1 3.607727
10 1 3.607727
ということで,行ごとに処理するためにrowwise
をかますのと,条件分岐で0のところは自動的に複製コピーされてるんだろうな,と思ったので0のところも関数で出てくるベクトルにしよう。ということでこんな感じで解決しました。
sample %>%
rowwise() %>%
mutate(value = if_else(FLG==0,rpois(1,0),rpois(1,lambda)))
ほうらね。
# A tibble: 10 × 2
# Rowwise:
FLG value
<int> <int>
1 1 2
2 1 3
3 1 4
4 0 0
5 0 0
6 1 4
7 1 1
8 0 0
9 1 3
10 1 1
以上,ゼロ過剰ポアソン分布の例を作ろうと思った時に直面した問題とその解決でした。
こんな感じで,自分のTips,こんなバグをこうやって解決したよ,というような話を,よろしければ皆さんもお寄せください。
出題編はこちらです。
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら,コメントいただけると幸いです。