提问人:CaseyR 提问时间:10/17/2023 最后编辑:r2evansCaseyR 更新时间:10/17/2023 访问量:39
如何从父数据帧的列中传递值以对下面两级的嵌套数据帧进行操作?
How can I pass values from columns of a parent dataframe to operate on a nested dataframe two levels below?
问:
我的 tibble 由几个参数值的常规列组成,包括 ,以及几个以 . 为前缀的列表列。这些列表列的每个观测值都是另一个杂项,一个常规列表示模拟编号,另一个列表列包含随机变量 ( 和 ) 的杂项。shocks_small
mu1
v1_v2_T
v1_v2
v1
v2
是否可以将参数值从父 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))))))
但是,此代码会引发错误,可能是因为嵌套最深的 - 似乎找不到值。map
mutate
mu1
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_small
map()
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)
)
答:
1赞
r2evans
10/17/2023
#1
我将演示使用,我认为使用是“隐藏”一些周围的上下文。这与过程大致相同。然而,这里的关键是,我们每个嵌套的只需要一个,即使我们可以使用 ,它也将是 length-2 而不是我们需要的组。为此,我将通过而不是 .mutate(across(..), ..)
modify_at
mu1
map
mu1
pmap
map
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) 似乎对较低级别可见。map
pmap
mu
评论