I am trying to generate random numbers within a tibble where different categories of item are distributed differently. I'm not having much luck. Here's the code and the error it produces:
library(dplyr)
letters <- tibble(letter = c(rep("A", 5), rep("B", 5), rep("C", 5) ))
letters %>%
rowwise() %>%
mutate(Proj = case_when(
letter == "A" ~ rpois(1, lambda = .7746),
letter == "B" ~ rnbinom(1, size = 3.3848, mu = 1.2),
letter == "C" ~ rpois(1, lambda = .5057)
))
#> Error in `mutate()`:
#> ! Problem while computing `Proj = case_when(...)`.
#> ℹ The error occurred in row 1.
#> Caused by error in `` names(message) <- `*vtmp*` ``:
#> ! 'names' attribute [1] must be the same length as the vector [0]
Interestingly, the code works just fine if I use continuous distributions instead of discrete distributions.
library(dplyr)
letters <- tibble(letter = c(rep("A", 5), rep("B", 5), rep("C", 5) ))
letters %>%
rowwise() %>%
mutate(Proj = case_when(
letter == "A" ~ rweibull(1, shape = 2.3487, scale = 8.174),
letter == "B" ~ rexp(1, rate = .0442),
letter == "C" ~ rnorm(1, mean = 0, sd = 1)
))
#> # A tibble: 15 × 2
#> # Rowwise:
#> letter Proj
#> <chr> <dbl>
#> 1 A 9.82
#> 2 A 7.72
#> 3 A 12.9
#> 4 A 7.81
#> 5 A 6.44
#> 6 B 10.4
#> 7 B 3.14
#> 8 B 1.48
#> 9 B 28.7
#> 10 B 11.0
#> 11 C -0.378
#> 12 C -0.340
#> 13 C 1.81
#> 14 C 1.03
#> 15 C -0.679
Created on 2022-07-29 by the reprex package (v2.0.1)
What's going on here?
CodePudding user response:
rpois
returns an integer. rnbinom
returns a double. The documentation for case_when
says:
The LHS must evaluate to a logical vector. The RHS does not
need to be logical, but all RHSs must evaluate to the same
type of vector.
So that's what is causing the issue. Either explicitly convert the output of rnbinom to integer or the output of rpois to numeric.