You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:27:13