【问题标题】:map_dfc for every row of dataframe with inputs具有输入的每一行数据帧的 map_dfc
【发布时间】:2019-04-20 11:07:38
【问题描述】:

我开始学习“purrr”库的用法,并想知道我将如何进行以下操作:

目标

将函数应用于数据帧的每一行,输入为列,并将函数输出作为输入数据帧中的列进行绑定

想法

从文档看来 map_dfc 是这里的完美功能

尝试的解决方案

library(purrr)
library(dplyr)

test_func <- function(n, lambda){
  return(n+lambda)
}

n <- seq(1,10,1)
lambda <- seq(1, 10, 1)

new_df <- list(n=n,lambda=lambda) %>% cross_df()

new_df <- map_dfc(new_df, test_func)
# even tried the below
# new_df <- map_dfc(new_df, ~test_func) 

错误

Error in .f(.x[[i]], ...) : argument "lambda" is missing, with no default

【问题讨论】:

    标签: r dplyr statistics purrr


    【解决方案1】:

    purrr 方式 - 似乎** - 将使用 invoke

    new_df %>% 
      mutate(new_col = invoke(test_func, new_df))
    # A tibble: 100 x 3
    #       n lambda new_col
    #   <dbl>  <dbl>   <dbl>
    # 1     1      1       2
    # 2     2      1       3
    # 3     3      1       4
    # 4     4      1       5
    # 5     5      1       6
    # 6     6      1       7
    # 7     7      1       8
    # 8     8      1       9
    # 9     9      1      10
    #10    10      1      11
    # … with 90 more rows
    

    来自帮助文件:

    这对函数可以更轻松地组合函数和参数列表来获得结果。 invoke 是 do.call 的一个包装器,可以在管道中轻松使用。

    所以invoke(test_func, new_df) 是一样的

    test_func(new_df[[1]], new_df[[2]])
    

    ** 帮助文件中还写着


    没有purrr

    do.call(test_func, new_df)
    

    【讨论】:

      【解决方案2】:

      您需要使用map2_* 系列函数,因为您在两列上使用walking:

      map2_dfc(new_df[1],new_df[2],test_func)
      

      编辑 你可以用baseReduce实现同样的效果:

       Reduce(test_func,new_df)
       #[1]  2  3  4  5  6  7  8  9 10 11
      

      purrr 输出: 您可以根据需要重命名您的列:

           n
         <dbl>
       1     2
       2     3
       3     4
       4     5
       5     6
       6     7
       7     8
       8     9
       9    10
      10    11
      

      【讨论】:

      • 输出是正确的,但是为什么在new_df上没有发生cbind。可能是我对这个函数的理解有误?
      • 此函数cbinds 结果但丢弃原始数据。您可以使用 mutate$ 添加它。
      【解决方案3】:

      扩展用户 markus 所说的内容,rlang::exec() 可以像已弃用的 purrr::invoke() 一样使用

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 2020-05-22
        • 2020-05-30
        • 2010-10-27
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        相关资源
        最近更新 更多