map_int()用于向量化用户定义的函数

时间:2018-05-03 08:11:49

标签: r

我定义了以下函数,它计算一段时间内的工作日数。

library(tidyverse)
library(lubridate)
fx_weekdays <- function(start_date, end_date){
  start_date <- as_date(start_date)
  end_date <- as_date(end_date)
  sum(!weekdays(seq(start_date, end_date, "days")) %in% c("Friday", "Saturday"))
}

接下来,我想使用map_int()循环遍历以下数据框,并添加一个新列以捕获结果。

df <- data.frame(start_date=c('2018-1-1','2018-2-1'),
           end_date=c('2018-1-31','2018-2-28'))

df %>% 
  mutate(n_weekday = map_int(df, fx_weekdays(start_date, end_date)))

我收到错误。

  

mutate_impl(.data,dots)出错:评估错误:&#39;来自&#39;必须   长度为1。

我不知道自己错过了什么,因为后续的expamle按预期工作。

fx_weekdays('2018-3-12', '2018-4-12')

2 个答案:

答案 0 :(得分:2)

如何使用map2_int呢?

library(tidyverse)
library(lubridate)
df %>% mutate(n_weekday = map2_int(start_date, end_date, fx_weekdays))
#>   start_date  end_date n_weekday
#> 1   2018-1-1 2018-1-31        23
#> 2   2018-2-1 2018-2-28        20

答案 1 :(得分:1)

我不确定您是否需要map_int,但您可以使用rowwise

进行此操作
df %>% 
  rowwise() %>% 
  mutate(n_weekday = fx_weekdays(start_date, end_date))

#  start_date end_date  n_weekday
#  <fct>      <fct>         <int>
#1 2018-1-1   2018-1-31        23
#2 2018-2-1   2018-2-28        20

我相信您必须知道您也可以使用基础R mapply执行此操作。

df$n_weekday <- mapply(fx_weekdays, df$start_date, df$end_date)

df
#  start_date  end_date n_weekday
#1   2018-1-1 2018-1-31        23
#2   2018-2-1 2018-2-28        20