首页 > 解决方案 > 为什么 tidyverse::map 不能在一个 tibble 中处理两个列表?

问题描述

我正在尝试计算列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

标签: rtidyversepurrrseq

解决方案


由于您有两个列表作为输入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"))
      ) 

推荐阅读