使用purrr :: pmap_dfc遍历函数并将函数名称保留为标题

时间:2018-12-06 14:36:30

标签: r function purrr

使用purrr::pmap_dfc后,我很难在最终数据帧中将函数名称作为标头使用。

我的最终代码具有V1V2作为标题,但是我希望将函数名add_1_times_multineg_1_times_multi作为标题。下面是一个代表。

library(tidyverse)
# define functions
add_1_times_multi <- function(vec, multi){(vec + 1) * multi}
neg_1_times_multi <- function(vec, multi){-(vec) * multi}

# put functions in list
my_functions <- function(vec,multi){
  list(
    add_1_times_multi(vec, multi),
    neg_1_times_multi(vec, multi)
  )
}

# define values
my_vector <- rnorm(n = 10, mean = 100, sd = 1)
multiplyr <- 3

# put values in list
l <- list(list(my_vector), multiplyr)

# purrr::pmap_dfc
pmap_dfc(l, my_functions)
#> # A tibble: 10 x 2
#>       V1    V2
#>    <dbl> <dbl>
#>  1  308. -305.
#>  2  305. -302.
#>  3  304. -301.
#>  4  304. -301.
#>  5  310. -307.
#>  6  304. -301.
#>  7  298. -295.
#>  8  300. -297.
#>  9  301. -298.
#> 10  305. -302.

reprex package(v0.2.1)于2018-12-06创建

如上所述,我希望最终结果具有add_1_times_multineg_1_times_multi作为列名。不是V1V2

1 个答案:

答案 0 :(得分:1)

您定义函数的方式非常曲折。不是创建2个函数,而是创建列出这些函数列表的第3个函数,为什么不直接创建可以提供所需功能的函数呢?

my_function <- function(vec, multi) {
  tibble(
    add_1_times_multi = (vec + 1) * multi,
    neg_1_times_multi = - vec * multi
  )
}

此外,由于您只有2个向量作为函数的参数,因此不需要pmap(),只需使用map2()

my_vector <- rnorm(n = 10, mean = 100, sd = 1)
multiplyr <- 3

map2_df(my_vector, multiplyr, my_function)

如果您确实要使用pmap()

l <- list(my_vector, multiplyr)

pmap_df(l, my_function)

请注意,您无需在my_vector中传递list(),而再通过list()multiplyr中传递。