#> 2 a,b,c b #> 3 a,b,c c #> 4 d,e,f,g d #> 5 d,e,f,g e #> 6 d,e,f,g f #> # ... 还有 1 行
(如果你发现自己经常使用这种模式,请务必查看 tidyr:separate_rows(),它是围绕这一常见模式的封装函数)。
这种模式的另一个例子是使用 purrr 中的 map()、map2()、pmap() 函数。例如,我们可以拿第 334 页“调用不同的函数”中的最后一个例子,将其改写为使用 mutate():
sim <- tribble( ~f, ~params, "runif", list(min = -1, max = -1), "rnorm", list(sd = 5), "rpois", list(lambda = 10) ) sim %>% mutate(sims = invoke_map(f, params, n = 10)) #> # 一个 tibble:3 × 3 #> f params sims #>
#> 1 runif <list [2]> <dbl [10]> #> 2 rnorm <list [1]> <dbl [10]> #> 3 rpois <list [1]> <int [10]>
注意,严格来说 sim 并不是同质的,因为它同时包含双精度向量和整数向量。不过,这不太可能造成太多问题,因为整数和双精度数都是数值向量。来自多值汇总 length: mtcars %>%
summarize() 的一个限制是,它只能与返回单个值的汇总函数配合使用。这意味着你不能将它与像 quantile() 这样返回任意长度向量的函数一起使用
group_by(cyl) %>% summarize(q = quantile(mpg)) #> Error in eval(expr, envir, enclos): 期望得到单个值