簡體   English   中英

具有分組隨機正態值的 R 模擬數據

[英]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

關於如何完成這項工作的任何建議都會很棒。

這是一種可以實現所需結果的方法,使用來自mappurrr 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM