r - 为什么 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
解决方案
由于您有两个列表作为输入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"))
)
推荐阅读
- javascript - 如何通过比较 JavaScript 中的两个字符串从字符串中获取一个值?
- python - 为什么 subprocess 不会仅以 Python 2.7 终止?
- android - Google Play 控制台 - Android Bundle 权限问题
- mongodb - Javers 异步提交到 Mongo DB
- node.js - JS 更新 Dynamo 表中的 Map 元素
- r-markdown - RMarkdown 到 Word - 分页符
- python - Traceback(最近一次通话最后一次):Anaconda 启动时出错
- java - 无法创建 JVM.JVM 路径
- windows - windows批处理脚本用破折号重命名文件
- windows - botium-cli 模拟器不适用于 rasa 连接器