map_int () для векторизации пользовательской функции - PullRequest
0 голосов
/ 03 мая 2018

Я определил следующую функцию, которая подсчитывает количество дней недели в периоде.

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): Ошибка оценки: 'from' must быть длиной 1.

Я не знаю, чего мне не хватает, поскольку следующий пример работает, как и ожидалось.

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

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Как насчет использования 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
0 голосов
/ 03 мая 2018

Я не уверен, что вам нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...