首页 > 解决方案 > 将多个函数传递给 map_dfr:map

问题描述

我正在尝试从 AWS 数据库中读取几个 CSV 文件,并且只保留每个 .csv 文件中最早日期的记录(每个 CSV 文件包含最后八天,只有最旧的日期是最终数据)。假设文件 A 包含 5 月 6 日至 14 日的数据,我想从文件 A 中过滤 5 月 6 日的唯一记录,从文件 B 中仅过滤 07 等等

我正在使用map_dfr从 AWS 数据库中读取数据,但是如何将多个函数传递给purrr::map_dfr. 我的代码段将毫无错误地运行,但它会保留所有日期/记录,所以~ min(lubridate::ymd(data_date))似乎没有处理

df  <-  map_dfr(
  objects,
  ~ s3read_using(
    FUN = read_csv,
    object = .x,
    bucket = "my_bucket"
  ),
  .id = 'Date' , ~ min(lubridate::ymd(data_date)) )

标签: rdictionarytidyversepurrr

解决方案


详细说明 paqmo 的评论:

library(aws.s3)
library(readr)
library(dplyr)

df <- map_dfr(
  objects,
  ~ s3read_using(
    FUN = read_csv,
    object = .x,
    bucket = "my_bucket"
  ) %>%
    mutate(data_date = lubridate::ymd(data_date)) %>%
    dplyr::filter(data_date == min(data_date)),
  .id = 'Date'
)

或者更清楚一些(也许):

read_from_s3_and_process <- function(object) {
  s3read_using(
    FUN = read_csv,
    object = object,
    bucket = "my_bucket"
  ) %>%
    mutate(data_date = lubridate::ymd(data_date)) %>%
    dplyr::filter(data_date == min(data_date))
}

df <- map_dfr(
  objects,
  read_from_s3_and_process,
  .id = 'Date'
)

推荐阅读