如何使用purrr为数据框每行生成含sample值的列?
解决方法:为数据框每行生成随机样本列(结合dplyr和purrr)
看起来你卡在了用dplyr分组后结合purrr生成每行随机值的环节上,我来帮你梳理问题和解决办法:
你的代码出错的原因
mutate_是已弃用的旧函数:现在dplyr推荐使用标准的mutate函数,mutate_属于早期的标准评估接口,语法和现在的整洁评估逻辑不兼容。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
相关产品推荐
相关产品推荐

