我定义了以下函数,它计算一段时间内的工作日数。
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')
答案 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