如何用dplyr映射返回不同大小正态分布列表的函数?
解决方案
要实现每行生成不同大小的正态分布列表,核心是让随机尺寸的计算在每行的函数调用中独立执行,而非提前计算一次复用。以下是两种简洁的实现方式:
方法一:在函数内部生成随机尺寸
调整自定义函数,让它在每次调用时自行生成随机样本量,这样map遍历每行时都会得到新的尺寸:
library(purrr) library(tibble) library(dplyr) example_seq_tbl <- tibble(var_a = seq(from = 1, to = 5, by = 1)) # 函数内部生成2-10之间的随机整数作为样本量(rnorm的n必须为整数) xy_function <- function(x) { n <- sample(2:10, size = 1) rnorm(n = n, mean = x) } # 遍历var_a,每行生成独立的随机尺寸正态分布 another_tbl <- example_seq_tbl %>% mutate(new_col = map(var_a, xy_function)) another_tbl
方法二:使用匿名函数传递动态参数
如果希望保留原函数的参数结构(从外部传入尺寸),可以在map中用匿名函数,让每次迭代都重新计算随机尺寸:
library(purrr) library(tibble) library(dplyr) example_seq_tbl <- tibble(var_a = seq(from = 1, to = 5, by = 1)) # 保留原函数,接受均值x和样本量y两个参数 xy_function <- function(x, y) { rnorm(n = y, mean = x) } # 匿名函数每次生成新的随机尺寸,再传入原函数 another_tbl <- example_seq_tbl %>% mutate(new_col = map(var_a, ~ xy_function(.x, sample(2:10, size = 1)))) another_tbl
问题原因说明
你之前尝试的mutate(new_col = map(var_a, xy_function, runif(n=1, min=2, max=10)))之所以失效,是因为runif(n=1, min=2, max=10)会在map执行之前就计算出一个固定值,之后所有行的函数调用都会复用这个值,导致样本量统一。而上面两种方法都是让随机尺寸的计算延迟到每行的函数调用时执行,从而实现每行独立的样本量。
内容的提问来源于stack exchange,提问作者f0nzie
相关产品推荐
相关产品推荐

