0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rtipsアタック25【解答編】Advent Calendar 2021

Day 5

A.行ごとに対応した条件で変数を作る

Last updated at Posted at 2021-12-04

これだとエラーなんだよね

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,こんなバグをこうやって解決したよ,というような話を,よろしければ皆さんもお寄せください。
出題編はこちらです。
あるいは「こちらの解法のほうが美しいぞ」というのがありましたら,コメントいただけると幸いです。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?