Почему tidyverse::map не работает с двумя списками в одном tibble?

#r #tidyverse #purrr #seq

#r #аккуратная вселенная #муррр #seq

Вопрос:

Я пытаюсь подсчитать, сколько дней в столбце dias_trabajo dias_evaluar .

 library(tidyverse)
library(lubridate)

 

Это мининал репрекс:

 tibble(
  dias_trabajo = list(seq(ymd("2021-01-01"), ymd("2021-01-22"), by = "day"), seq(ymd("2021-01-04"), ymd("2021-01-22"), by = "day")),
  dias_evaluar = list(seq(ymd("2021-01-01"), ymd("2021-01-07"), by = "day"))
) %>% 
  mutate(
    trabajo = map(dias_trabajo, function(x) x %in% dias_evaluar) %>% map_int(sum)
  )
 

Приведенный выше код выдает нули по адресу trabajo .

 # A tibble: 2 x 3
  dias_trabajo dias_evaluar trabajo
  <list>       <list>         <int>
1 <date [22]>  <date [7]>         0
2 <date [19]>  <date [7]>         0
 

Я ожидаю, что столбец trabajo будет: первая строка: 7, вторая строка: 4.

Я попробовал использовать только одну строку, и это сработало:

 seq(ymd("2021-01-01"), ymd("2021-01-22"), by = "day") %in% seq(ymd("2021-01-01"), ymd("2021-01-07"), by = "day") %>% sum()

 

дает. Это ожидаемый результат для первой строки.

 [1] 7
 

Комментарии:

1. map2 . У вас есть два списка dias_trabajo и dias_evaluar

2. Не могли бы вы опубликовать и ответить?, Я выберу ваш ответ как правильный.

Ответ №1:

Поскольку у вас есть два списка в качестве входных dias_trabajo данных, и dias_evaluar вам нужно использовать map2

 library(tidyverse)
library(lubridate)

  
tb %>% 
  mutate(
    trabajo = map2_dbl(.x = dias_trabajo, .y = dias_evaluar, ~sum(.x %in% .y))
    )

# A tibble: 2 x 3
  dias_trabajo dias_evaluar trabajo
  <list>       <list>         <int>
1 <date [22]>  <date [7]>         7
2 <date [19]>  <date [7]>         4
 

данные:

 tb <- tibble(
        dias_trabajo = list(seq(ymd("2021-01-01"), ymd("2021-01-22"), by = "day"), seq(ymd("2021-01-04"), ymd("2021-01-22"), by = "day")),
        dias_evaluar = list(seq(ymd("2021-01-01"), ymd("2021-01-07"), by = "day"))
      )