データフレームで、条件に応じて乱数を生成する
データフレームで、他の列の値に応じて異なるルールで乱数を生成したい
手元で適当な乱数を生成し、それをもとに何かしらの分析手法を試すことがあると思います。
そういった時、ある列に同一のルールで乱数を生成するのであれば以下のようにします。
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の場合、それぞれで同じ値が反映されている。
以上でした!