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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了map_dfc用于带输入的每一行数据帧相关的知识,希望对你有一定的参考价值。

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

目的

将一个函数应用于数据框的每一行,输入为列,并将函数输出作为输入数据框中的列cbind

理念

从文档中看来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
答案

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)
另一答案

您需要使用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

以上是关于map_dfc用于带输入的每一行数据帧的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在数据帧的每一行上使用 spark sql 函数吗?

如何将每一行熊猫数据帧附加到另一个数据帧的每一行

迭代火花数据帧中的每一行并检查每一行是不是包含某个值

将数据帧的每一行转换为字符串

从数据帧的每一行中提取信息而无需循环

为 pyspark 数据帧的每一行评估多个 if elif 条件