当一个变量不是函数的一部分时使用 purrr::map2

Using purrr::map2 when one variable is not part of the function

如果我有这样的功能:

foo <- function(var) {
  if(length(var) > 5) stop("can't be greater than 5")

  data.frame(var = var)
}

有效的地方:

df <- 1:20

foo(var = df[1:5])

但这并没有:

foo(var = df)

期望的输出是:

   var
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
11  11
12  12
13  13
14  14
15  15
16  16
17  17
18  18
19  19
20  20

如果我知道我只能 运行 这个函数在 5 行的块中,如果我想评估所有 20 行,最好的方法是什么?我可以为此使用 purrr::map() 吗?假设 5 行约束是刚性的。

提前致谢。

我们 split df 以 5 个为一组,然后使用 purrr::map_dfr 对它们应用 foo 函数,然后 bind 按行 [=] 16=]

library(tidyverse)

foo <- function(var) {
  if(length(var) > 5) stop("can't be greater than 5")

  data.frame(var = var)
}

df <- 1:20
df_split <- split(df, (seq(length(df))-1) %/% 5)
df_split

map_dfr(df_split, ~ foo(.x))

   var
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  10
11  11
12  12
13  13
14  14
15  15
16  16
17  17
18  18
19  19
20  20

您可以使用 dplyr::group_bytapply :

data.frame(df) %>%
  mutate(grp = (row_number()-1) %/% 5) %>%
  group_by(grp) %>%
  mutate(var = foo(df)$var) %>%
  ungroup %>%
  select(var)

# # A tibble: 20 x 1
#     var
# <int>
# 1     1
# 2     2
# 3     3
# 4     4
# 5     5
# 6     6
# 7     7
# 8     8
# 9     9
# 10    10
# 11    11
# 12    12
# 13    13
# 14    14
# 15    15
# 16    16
# 17    17
# 18    18
# 19    19
# 20    20

data.frame(var=unlist(tapply(df,(df-1) %/% 5,foo)))
#    var
# 01   1
# 02   2
# 03   3
# 04   4
# 05   5
# 11   6
# 12   7
# 13   8
# 14   9
# 15  10
# 21  11
# 22  12
# 23  13
# 24  14
# 25  15
# 31  16
# 32  17
# 33  18
# 34  19
# 35  20