いろいろやってみよう

完璧を目指すより、まず終わらせろ

データフレームで、条件に応じて乱数を生成する

データフレームで、他の列の値に応じて異なるルールで乱数を生成したい

手元で適当な乱数を生成し、それをもとに何かしらの分析手法を試すことがあると思います。
そういった時、ある列に同一のルールで乱数を生成するのであれば以下のようにします。

library(tidyverse)

set.seed(71)
len <- 10
dat_1 <- data.frame(v = rnorm(len, 100, 10))
dat_1

           v
1   95.68158
2   95.52813
3   95.21427
4  104.17145
5   95.82099
6   88.12836
7   89.27714
8  110.03284
9   88.91522
10 112.63431


ここで、別の列に何かしらのフラグが設定されており、その値に応じてそれぞれ異なるルールで乱数を設定したい場合は、以下のように行います。

set.seed(71)
len <- 10
dat_2 <- data.frame(f = c(as.integer(runif(len, 0, 2))))
dat_2 <- dat_2 %>% 
  mutate(v = case_when(f == 1 ~ rnorm(len, 600, 50),
                         f == 0 ~ rnorm(len, 200, 50),
                         TRUE ~ -100))
dat_2

   f        v
1  0 118.9311
2  1 546.3857
3  0 239.0665
4  0 194.5544
5  0 196.2005
6  1 614.6475
7  1 627.4138
8  1 556.6673
9  0 205.9063
10 0 112.1548

失敗例

最初、以下のように記述していて失敗していました。

set.seed(71)
len <- 10
dat_ng <- data.frame(f = c(as.integer(runif(len, 0, 2))))
dat_ng <- dat_ng %>% 
  mutate(v = case_when(f == 1 ~ rnorm(1, 600, 50), # 生成する乱数を、1つにしている
                         f == 0 ~ rnorm(1, 200, 50), # 上記同様
                         TRUE ~ -100))
dat_ng

   f        v
1  0 146.3857
2  1 540.6418
3  0 146.3857
4  0 146.3857
5  0 146.3857
6  1 540.6418
7  1 540.6418
8  1 540.6418
9  0 146.3857
10 0 146.3857
# fが0の場合、fが1の場合、それぞれで同じ値が反映されている。


以上でした!