将 rpois 和 rnbinom 与 dplyr 命令结合使用

Dan*_*Dan 3 random r dplyr

我试图在小标题中生成随机数,其中不同类别的项目分布不同。我运气不太好。这是代码及其产生的错误:

\n
library(dplyr)\n\nletters <- tibble(letter = c(rep("A", 5), rep("B", 5), rep("C", 5) ))\n\nletters %>%\n  rowwise() %>%\n  mutate(Proj = case_when(\n    letter == "A" ~ rpois(1, lambda = .7746),\n    letter == "B" ~ rnbinom(1, size = 3.3848, mu = 1.2),\n    letter == "C" ~ rpois(1, lambda = .5057)\n  ))\n\n#> Error in `mutate()`:\n#> ! Problem while computing `Proj = case_when(...)`.\n#> \xe2\x84\xb9 The error occurred in row 1.\n#> Caused by error in `` names(message) <- `*vtmp*` ``:\n#> ! \'names\' attribute [1] must be the same length as the vector [0]\n
Run Code Online (Sandbox Code Playgroud)\n

有趣的是,如果我使用连续分布而不是离散分布,代码就可以正常工作。

\n
library(dplyr)\n\nletters <- tibble(letter = c(rep("A", 5), rep("B", 5), rep("C", 5) ))\n\nletters %>%\n  rowwise() %>%\n  mutate(Proj = case_when(\n    letter == "A" ~ rweibull(1, shape = 2.3487, scale = 8.174),\n    letter == "B" ~ rexp(1, rate = .0442),\n    letter == "C" ~ rnorm(1, mean = 0, sd = 1)\n  ))\n\n#> # A tibble: 15 \xc3\x97 2\n#> # Rowwise: \n#>    letter   Proj\n#>    <chr>   <dbl>\n#>  1 A       9.82 \n#>  2 A       7.72 \n#>  3 A      12.9  \n#>  4 A       7.81 \n#>  5 A       6.44 \n#>  6 B      10.4  \n#>  7 B       3.14 \n#>  8 B       1.48 \n#>  9 B      28.7  \n#> 10 B      11.0  \n#> 11 C      -0.378\n#> 12 C      -0.340\n#> 13 C       1.81 \n#> 14 C       1.03 \n#> 15 C      -0.679\n
Run Code Online (Sandbox Code Playgroud)\n

由reprex 包(v2.0.1)于 2022-07-29 创建

\n

这里发生了什么?

\n

Das*_*son 5

rpois返回一个整数。rnbinom返回一个双精度数。的文档case_when说:

      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.
Run Code Online (Sandbox Code Playgroud)

这就是导致问题的原因。要么将 rnbinom 的输出显式转换为整数,要么将 rpois 的输出显式转换为数值。