[英]R simulation data with grouped random normal values
我有一個數據集,其中包含大約 10k 個與產品及其價格相關的數據點。 我想根據產品價格從遵循特定模式的正態分布生成模擬銷售數據。 例如,如果價格較低,例如,應從均值為 120 且 sd=20 的正態分布中提取少於 40 個銷售額(數量)。 如果價格是平均的,例如在 40 和 50 之間,數量應該從均值為 80 且 sd=15 的正態分布中提取。 如果價格很高,例如高於 50,則應從平均值為 20 且 sd=3 的正態中提取數量
我創建了以下工作示例:
dt <- tibble(sample(x = c("cheap","mediumA", "mediumB",
"mediumC", "expensive"),
prob = c(.3, .2,.2,.2, .1),
size = 10000,
replace = TRUE))
dt <- dt %>%
mutate(productName=`sample(...)`,
Price=case_when(
productName=="cheap"~10,
productName=="mediumA"~40,
productName=="mediumB"~45,
productName=="mediumC"~50,
TRUE~300)) %>%
select(productName, Price)
我嘗試了以下方法,但它不起作用。
dt %>% count(Price)
dt <- dt %>%
mutate(
Quantity=case_when(
Price<40 ~
rnorm(dt %>%
filter(Price<40) %>%
count(Price) %>%
pull(n), 120, 20),
Price >=40 & Price <= 50 ~
rnorm(dt %>%
filter(Price >=40 &
Price <= 50) %>%
count(Price) %>%
pull(n) %>%
sum(), 80, 15),
TRUE~
rnorm(dt %>%
filter(Price>50) %>%
count(Price) %>%
pull(n), 20, 3)))
上述 R 腳本產生以下錯誤消息:
Error:
Price < 40 ~ rnorm(dt %>% filter(Price < 40) %>% count(Price) %>% pull(n), 120, 20),
Price >= 40 & Price <= 50 ~ rnorm(dt %>% filter(Price >= 40 &
Price <= 50) %>% count(Price) %>% pull(n) %>% sum(), 80, 15),
TRUE ~ rnorm(dt %>% filter(Price > 50) %>% count(Price) %>% pull(n), 20, 3)
must be length 1000 or one, not 313, 597, 90 Call rlang::last_error() to see a backtrace
關於如何完成這項工作的任何建議都會很棒。
這是一種可以實現所需結果的方法,使用來自map
的purrr
package 的tidyverse
:
fun <- function(p) {
case_when(p < 40 ~ rnorm(1, 120, 20),
p <= 50 ~ rnorm(1, 80, 15),
p > 50 ~ rnorm(1, 20, 3))
}
dt %>%
mutate(Quantity = map_dbl(Price, fun))
您可以使用嵌套ifelse
,但是,您需要計算范圍內有多少個值(我們使用sum
來計算)並將它們一起生成在rnorm
的一個 go 中。
library(dplyr)
dt %>%
mutate(Quantity= ifelse(Price < 40, rnorm(sum(Price < 40), 120, 20),
ifelse(Price <= 50, rnorm(sum(Price >= 40 & Price < 50), 80, 12),
rnorm(sum(Price > 50), 20, 3))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.