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

如何使用purrr为数据框每行生成含sample值的列?

解决方法:为数据框每行生成随机样本列(结合dplyr和purrr)

看起来你卡在了用dplyr分组后结合purrr生成每行随机值的环节上,我来帮你梳理问题和解决办法:

你的代码出错的原因

  1. mutate_是已弃用的旧函数:现在dplyr推荐使用标准的mutate函数,mutate_属于早期的标准评估接口,语法和现在的整洁评估逻辑不兼容。
  2. map_dbl缺少迭代对象:你单独用1:5 %>% map_dbl(...)能运行,是因为1:5给了map_dbl明确的迭代长度(5次);但在mutate里,你没有告诉map_dbl要循环多少次(也就是对应数据框的多少行),所以它无法生成对应数量的随机值。

方案1:最简单的向量化实现(无需purrr)

其实生成每行的随机数不需要用到purrr,sample本身可以直接生成对应行数的向量,配合dplyr的mutate就足够:

library(dplyr)

df <- data.frame(x = rep(1:3, each=4), y=99)

# 为每行生成1-50的随机数
df %>% 
  mutate(val = sample(50, n(), replace = TRUE))

如果需要分组后在每个组内生成随机数,加上group_by即可:

df %>% 
  group_by(x) %>% 
  mutate(val = sample(50, n(), replace = TRUE)) %>% 
  ungroup()  # 记得取消分组,避免后续操作出错

这里的n()在dplyr语境中会自动返回当前分组的行数(未分组时是整个数据框的行数)。


方案2:用purrr的map_dbl实现(满足你的purrr学习需求)

如果你一定要用purrr来实现,只需要给map_dbl提供一个和数据框行数等长的迭代对象(比如1:n()),让它循环对应次数生成随机数:

library(dplyr)
library(purrr)

# 全局每行生成随机数
df %>% 
  mutate(val = map_dbl(1:n(), ~ sample(50, 1)))

# 分组后每个组内每行生成随机数
df %>% 
  group_by(x) %>% 
  mutate(val = map_dbl(1:n(), ~ sample(50, 1))) %>% 
  ungroup()

这里的~ sample(50,1)是简化的lambda函数写法,等价于function(.x) sample(50,1)(purrr中默认用.x表示迭代的元素,不过这里我们其实不需要用到这个元素,只是借它来控制循环次数)。


验证效果

运行上述代码后,你会得到一个新增的val列,每行都是1-50之间的随机整数,完全符合你的需求。

内容的提问来源于stack exchange,提问作者jyjek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:31