R语言 如何灵活地为pmap()的.l提供可变长度的参数

rqqzpn5f  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(115)

下面是一个pmap()操作,需要我的数据是宽格式的。我每天执行一些模拟,并将每次模拟的最大值捕获为post_max

library(tidyverse)

POST_SIMS <- 2
CONDITIONS <- 3
DURATION <- 2

df <-
    tibble(
        day = rep(1:DURATION, each = CONDITIONS),
        condition = rep(LETTERS[1:CONDITIONS], times = DURATION)
    ) |>
    rowwise() |>
    mutate(post = list(rnorm(POST_SIMS, 0, 1))) |>
    ungroup()

df_wide <- df |> 
    pivot_wider(
        id_cols = c(day), 
        names_from = "condition",
        values_from = 'post'
    ) 

df_wide |> 
    mutate(
        post_max = 
            pmap(
                .l = list(A,B,C), # This works, but needs manual updating
                .f = pmax)
    ) |> 
    unnest()

字符串
问题是,当我到达pmap(list(A,B,C), pmax)时,我必须手动列出唯一条件,这是不可取的,因为我的目标是编写一个可以容纳任何数量条件的模拟函数。
有没有一种方法可以捕获df中生成的唯一条件,并将其作为参数提供给pmap(),就像我在下面尝试但失败的那样?

my_conditions <- noquote(unique(df$condition)) 

df_wide |> 
    mutate(
        post_max = 
            pmap(
                .l = list(my_conditions), # How do I do this part? 
                .f = pmax)
    ) |> 
    unnest()


提供给list().l参数有点让我困惑。这显然不是一个字符串。我把它写成.l = list(A,B,C),这通常很方便,但模糊了pmap()是什么。我假设我正在处理某种整洁的评估,但是这个参数长度的灵活性与我的典型的整洁的eval应用程序不同,在我的典型的eval应用程序中,我只是将列命名为quosures。

iecba09b

iecba09b1#

list(A,B,C)在这个上下文中只是从mutate().data参数(df_wide)中选择列ABC,将它们添加到列表中基本上会生成一个类似tibble的结构。尝试将list(A,B,C)替换为pick(-day)

glimpse(df_wide)
#> Rows: 2
#> Columns: 4
#> $ day <int> 1, 2
#> $ A   <list> <-1.4857029, -0.2090127>, <-1.6142362, 0.2935161>
#> $ B   <list> <2.610475, -1.604595>, <-1.455556395, 0.003465559>
#> $ C   <list> <-0.06067370, 0.09182582>, <-0.5745877, -1.0695619>

df_wide |> 
  mutate(
    post_max = 
      pmap(
        .l = pick(-day),
        .f = pmax)
  ) |> 
  unnest()
#> Warning: `cols` is now required when using `unnest()`.
#> ℹ Please use `cols = c(A, B, C, post_max)`.
#> # A tibble: 4 × 5
#>     day      A        B       C post_max
#>   <int>  <dbl>    <dbl>   <dbl>    <dbl>
#> 1     1 -1.49   2.61    -0.0607   2.61  
#> 2     1 -0.209 -1.60     0.0918   0.0918
#> 3     2 -1.61  -1.46    -0.575   -0.575 
#> 4     2  0.294  0.00347 -1.07     0.294

字符串
rowwise() + max(c_across())应该会得到相同的结果,尽管我猜它更容易理解:

df_wide |> 
  unnest_longer(-day) |>
  rowwise() |>
  mutate(post_max = max(c_across(-day))) |>
  ungroup()

相关问题