在dplyr中使用rpois和rnbinom生成随机数报错问题咨询
按类别生成不同分布随机数:离散分布报错,连续分布正常的原因
问题重现
尝试在tibble中为不同类别项生成不同分布的随机数时,使用离散分布函数出现报错,但连续分布函数可以正常运行:
报错的离散分布代码
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]
正常运行的连续分布代码
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
原因分析
核心问题是**case_when要求所有分支返回的结果类型完全一致**:
- 离散分布中,
rpois()返回的是**整数型(integer)向量;而当rnbinom()的size参数为非整数时,它返回的是数值型(numeric)**向量。两种类型不匹配,触发了报错。 - 连续分布的所有函数(
rweibull()、rexp()、rnorm())返回的都是数值型向量,类型统一,所以能正常运行。
解决方案
把所有离散分布的输出统一转为数值型即可,常见两种方式:
方式1:用as.numeric()包裹生成函数
letters %>% rowwise() %>% mutate(Proj = case_when( letter == "A" ~ as.numeric(rpois(1, lambda = .7746)), letter == "B" ~ rnbinom(1, size = 3.3848, mu = 1.2), letter == "C" ~ as.numeric(rpois(1, lambda = .5057)) ))
方式2:用+0隐式转换类型
letters %>% rowwise() %>% mutate(Proj = case_when( letter == "A" ~ rpois(1, lambda = .7746) + 0, letter == "B" ~ rnbinom(1, size = 3.3848, mu = 1.2), letter == "C" ~ rpois(1, lambda = .5057) + 0 ))
两种方法都能让所有分支返回数值型向量,解决类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

