如何从父数据帧的列中传递值以对下面两级的嵌套数据帧进行操作?

How can I pass values from columns of a parent dataframe to operate on a nested dataframe two levels below?

提问人:CaseyR 提问时间:10/17/2023 最后编辑:r2evansCaseyR 更新时间:10/17/2023 访问量:39

问:

我的 tibble 由几个参数值的常规列组成,包括 ,以及几个以 . 为前缀的列表列。这些列表列的每个观测值都是另一个杂项,一个常规列表示模拟编号,另一个列表列包含随机变量 ( 和 ) 的杂项。shocks_smallmu1v1_v2_Tv1_v2v1v2

是否可以将参数值从父 tibble 向下传递到两个深度级别到对随机变量 tibble 进行操作的函数?目标是遍历父表的每一行,然后再次遍历每个模拟。

此代码有效,因为它不需要以下任何值:shocks_small

shocks_small %>%
  modify_at(vars(starts_with("v1_v2_T")), \(z)
            z %>% map(\(x)
                      x %>%
                        mutate(v1_v2 = map(v1_v2, \(y) 
                                           y %>% mutate(e1 = lag(v1, 1))))))

但是,此代码会引发错误,可能是因为嵌套最深的 - 似乎找不到值。mapmutatemu1

shocks_small %>%
  modify_at(vars(starts_with("v1_v2_T")), \(z)
            z %>% map(\(x)
                      x %>%
                        mutate(v1_v2 = map(v1_v2, \(y) 
                                           y %>% mutate(e1 = mu1 + lag(v1, 1))))))

Error in `map()`:
ℹ In index: 1.
ℹ With name: v1_v2_T12.
Caused by error in `map()`:
ℹ In index: 1.
Caused by error in `mutate()`:
ℹ In argument: `v1_v2 = map(v1_v2, function(y) y %>% mutate(e1 = mu1 + lag(v1, 1)))`.
Caused by error in `map()`:
ℹ In index: 1.
Caused by error in `mutate()`:
ℹ In argument: `e1 = mu1 + lag(v1, 1)`.
Caused by error:
! object 'mu1' not found
Backtrace:
  1. shocks_small %>% ...
 35. dplyr:::mutate.data.frame(., e1 = mu1 + lag(v1, 1))
 36. dplyr:::mutate_cols(.data, dplyr_quosures(...), by)
 38. dplyr:::mutate_col(dots[[i]], data, mask, new_columns)
 39. mask$eval_all_mutate(quo)
 40. dplyr (local) eval()

有没有办法从最里面访问回去,或者在每次迭代中传递值?感谢任何建议。shocks_smallmap()mu1

更新:下面是用于重现简化数据集的代码,以便与我提供的代码兼容:

intermediate_tbl1 <- map_dfr(1:5, ~ map_dfc(1:2, ~runif(5)) %>% 
      set_names(c("v1", "v2")) %>% 
      mutate(repl = .x) %>% 
      relocate(repl, .before = everything())) %>% 
      nest(v1_v2 = c(v1, v2))

intermediate_tbl2 <- map_dfr(1:5, ~ map_dfc(1:2, ~runif(10)) %>% 
          set_names(c("v1", "v2")) %>% 
          mutate(repl = .x) %>% 
          relocate(repl, .before = everything())) %>% 
  nest(v1_v2 = c(v1, v2))

parameter <- tibble(mu1 = c(1, 2))

shocks_small <- parameter %>% mutate(
  v1_v2_T = list(intermediate_tbl1, intermediate_tbl2)
)
r tidyverse 咕噜

评论


答:

1赞 r2evans 10/17/2023 #1

我将演示使用,我认为使用是“隐藏”一些周围的上下文。这与过程大致相同。然而,这里的关键是,我们每个嵌套的只需要一个,即使我们可以使用 ,它也将是 length-2 而不是我们需要的组。为此,我将通过而不是 .mutate(across(..), ..)modify_atmu1mapmu1pmapmap

out <- shocks_small %>%
  mutate(
    across(starts_with("v1_v2_T"),
           \(z) pmap(list(z, mu1), \(x, mu)
                     mutate(x, v1_v2 =
                                 map(v1_v2, \(y) mutate(y, e1 = mu + lag(v1, 1))))) )
  )
out$v1_v2_T[[1]]$v1_v2[[1]]
# # A tibble: 5 × 3
#       v1     v2    e1
#    <dbl>  <dbl> <dbl>
# 1 0.664  0.163  NA   
# 2 0.216  0.637   1.66
# 3 0.0754 0.0446  1.22
# 4 0.572  0.838   1.08
# 5 0.208  0.564   1.57

一旦我们通过了第一级 -,我们的 (length-1) 似乎对较低级别可见。mappmapmu