带输入的数据帧每一行的map_dfc

时间:2019-04-20 11:07:39

标签: r purrr

我开始学习“ 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

3 个答案:

答案 0 :(得分:2)

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]])

**帮助文件还显示enter image description here


没有purrr软件包

do.call(test_func, new_df)

答案 1 :(得分:1)

您需要使用map2_*系列函数,因为您需要walk分为两列:

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

编辑 您可以使用base的{​​{1}}实现相同的目标:

Reduce

Reduce(test_func,new_df) #[1] 2 3 4 5 6 7 8 9 10 11 输出: 您可以根据需要重命名列:

purrr

答案 2 :(得分:1)

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