我正在研究tidyverse包装。因此,我对如何以整洁的方式完成以下任务感兴趣。使用*thisDirectiveIMadeForJustOneComponentWhichMakesItRequireBeingPlacedInItsOwnModule
函数可以轻松解决该问题。
请考虑以下数据
*apply
我使用tb <-
lapply(matrix(c("a", "b", "c")), function(x)
rep(x, 3)) %>% unlist %>% c(rep(c(1, 2, 3), 6)) %>% matrix(ncol = 3) %>%
as_tibble(.name_repair = ~ c("tag", "x1", "x2")) %>% type.convert()
# A tibble: 9 x 3
tag x1 x2
<fct> <int> <int>
1 a 1 1
2 a 2 2
3 a 3 3
4 b 1 1
5 b 2 2
6 b 3 3
7 c 1 1
8 c 2 2
9 c 3 3
函数对它们进行分组,对于每个组,我希望应用与函数nest()
列表不同的函数
f_1, f_2, f_3
我尝试使用invoke_map来应用功能
f_1 <- function(x)
x[,1] + x[,2]
f_2 <- function(x)
x[,1] - x[,2]
f_3 <- function(x)
x[,1] * x[,2]
tb_func_attached <-
tb %>% group_by(tag) %>% nest() %>% mutate(func = c(f_0, f_1, f_2))
# A tibble: 3 x 3
tag data func
<fct> <list> <list>
1 a <tibble [3 x 2]> <fn>
2 b <tibble [3 x 2]> <fn>
3 c <tibble [3 x 2]> <fn>
但是在运行以下代码时,我得到了错误tb_func_attached %>% {invoke_map(.$func, .$data)}
invoke_map(tb_func_attached$func, tb_func_attached$data)
Error in (function (x) : unused arguments (x1 = 1:3, x2 = 1:3)
但是> tb_func_attached$func[[1]](tb_func_attached$data[[1]])
x1
1 2
2 4
3 6
> tb_func_attached$func[[2]](tb_func_attached$data[[2]])
x1
1 0
2 0
3 0
> tb_func_attached$func[[3]](tb_func_attached$data[[3]])
x1
1 1
2 4
3 9
仍然不起作用。
因此问题是,给定嵌套数据invoke_map
,如何将功能tb_func_attached
“逐行”应用于tb_func_attached$func
?
还有一个疑问,tb_func_attached$data
退休的原因是什么?它非常适合“恕我直言”的概念。
以前的版本处理单列数据(invoke_map
仅具有标签和tb
列)和@A。苏里曼的评论提供了解决方案。
但是,当嵌套小标题中的数据列具有矩阵结构时,代码将再次运行。
答案 0 :(得分:0)
使用map2
首先在函数列表上进行迭代,然后在数据列上进行迭代。像这样:
tb_func_attached %>%
mutate(output = map2(func, data, ~ .x(.y))) %>%
unnest(data, output)
输出看起来是这样的:
# A tibble: 9 x 4
tag x1 x2 x11
<fct> <int> <int> <int>
1 a 1 1 2
2 a 2 2 4
3 a 3 3 6
4 b 1 1 0
5 b 2 2 0
6 b 3 3 0
7 c 1 1 1
8 c 2 2 4
9 c 3 3 9