我理解如何使用map迭代df中的参数并创建一个新的列表列.
例如,
params <- expand.grid(param_a = c(2, 4, 6)
,param_b = c(3, 6, 9)
,param_c = c(50, 100)
,param_d = c(1, 0)
)
df.preprocessed <- dplyr::as.tbl(params) %>%
dplyr::mutate(test_var = purrr::map(param_a, function(x){
rep(5, x)
}
))
Run Code Online (Sandbox Code Playgroud)
但是,如果我想指定2个以上的参数,如何在pmap中使用类似的语法?
df.preprocessed <- dplyr::as.tbl(params) %>%
dplyr::mutate(test_var = purrr::pmap(list(x = param_a
,y = param_b
,z = param_c
,u = param_d), function(x, y){
rep(5,x)*y
}
)
)
Run Code Online (Sandbox Code Playgroud)
错误输出:
mutate_impl(.data,dots)出错:评估错误:未使用的参数(z = .l [[c(3,i)]],u = .l [[c(4,i)]]).
sin*_*eso 13
使用时pmap,第一个参数是一个列表,因此您可以直接将数据框传递给它,然后在函数中使用与数据框中列相同的名称命名参数.您需要unnest()解压缩返回的列表元素pmap():
df.preprocessed <- dplyr::as.tbl(params) %>%
dplyr::mutate(test_var = purrr::pmap(., function(param_a, param_b, ...){
rep(5, param_a) * param_b
})) %>%
tidyr::unnest()
> df.preprocessed
# A tibble: 144 x 5
param_a param_b param_c param_d test_var
<dbl> <dbl> <dbl> <dbl> <dbl>
1 2 3 50 1 15
2 2 3 50 1 15
3 4 3 50 1 15
4 4 3 50 1 15
5 4 3 50 1 15
6 4 3 50 1 15
7 6 3 50 1 15
8 6 3 50 1 15
9 6 3 50 1 15
10 6 3 50 1 15
# ... with 134 more rows
Run Code Online (Sandbox Code Playgroud)
直接使用rowwise和mutate不使用如何map:
my_fun <- function(param_a, param_b){
rep(5, param_a) * param_b
}
df.preprocessed <- dplyr::as.tbl(params) %>%
rowwise() %>%
dplyr::mutate(test_var = list(my_fun(param_a, param_b))) %>%
tidyr::unnest()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2628 次 |
| 最近记录: |