Получить ежедневные данные для каждой переменной, используя mapply - PullRequest
3 голосов
/ 05 апреля 2020

У меня есть функция, целью которой является получение ежедневных данных для каждой переменной в столбце на data.frame. Диапазон - полный месяц, но может быть любым другим диапазоном.

Мой df имеет столбец unit_id, поэтому мне нужно, чтобы моя функция взяла первые id столбца unit_id и извлекла данные для каждой даты march.

| unit | unit_id |
|:-----:|----------|
|  AE   |    123   |
|  AD   |    456   |
|  AN   |    789   |

Но сейчас моя функция зацикливает идентификаторы на unit_id столбец. Так как у меня 3 ids, на 4-й день функция снова использует 1-й идентификатор , а затем на 5-й день использует 2nd id и так далее. И это повторяется до последнего дня месяца.

Мне нужно использовать каждый идентификатор для каждого дня месяца.

код:

my_dates <- seq(as.Date("2020-03-01"), as.Date("2020-03-31"), by = 1)

my_fetch <- function(unit, unit_id, d) {


  df <- google_analytics(unit_id,
                         date_range = c(d, d),
                         metrics = c("totalEvents"),
                         dimensions = c("ga:date", "ga:eventCategory", "ga:eventAction", "ga:eventLabel"),
                         anti_sample = TRUE)

  df$unidad_de_negocio <- unit


  filename <- paste0(unit, "-", "total-events", "-", d, ".csv")
  path <- "D:\\america\\costos_protv\\total_events"
  write.csv(df, file.path(path, filename), row.names = FALSE)
  print(filename)
  rm(df)
  gc()


}




monthly_fetches <- mapply(my_fetch, df$unit,
                          df$unit_id,
                          my_dates, SIMPLIFY = FALSE)

Вариация 2: По месяцам

Спасибо, Акрун. Ваш ответ работает.

Я пытался отредактировать его, а не использовать в другом аналогичном сценарии:

1.- Ежемесячно начинается и заканчивается: теперь циклы не являются датой одного дня, но имеют начало и конец. Я назвал это monthly_dates

|    starts   |    ends    |
|:-----------:|------------|
|  2020-02-01 | 2020-02-29 |
|  2020-03-01 | 2020-03-31 |

Я пытался адаптировать решение, но оно не работает. Можете ли вы увидеть это и сказать мне, почему? Спасибо.

monthly_fetches <- Map(function(x, y) 
                   lapply(monthly_dates, function(d1, d2) my_fetch(x, y, monthly_dates$starts, monthly_dates$ends)))

Основная функция адаптирована для использования 2 дат (начало "d1" и конец "d2"):

my_fetch <- function(udn, udn_id, d1, d2) {

    df <- google_analytics(udn_id,
                           date_range = c(d1, d2),
                           metrics = c("totalEvents"),
                           dimensions = c("ga:month"),
                           anti_sample = TRUE)

    df$udn <- udn
    df$udn_id <- udn_id

    df

}

** Код для сделать месячные диапазоны дат: **

make_date_ranges <- function(start, end){

  starts <- seq(from = start,
                to =  Sys.Date()-1 ,
                by = "1 month")

  ends <- c((seq(from = add_months(start, 1),
                 to = end,
                 by = "1 month" ))-1,
            (Sys.Date()-1))

  data.frame(starts,ends)

}

## useage
monthly_dates <- make_date_ranges(as.Date("2020-02-01"), Sys.Date())

Обновление 1:

dput (month_fetches [1])

list(AE = list(structure(list(month = "02", totalEvents = 19670334, 
    udn = "AE", udn_id = 74415341), row.names = 1L, totals = list(
    list(totalEvents = "19670334")), minimums = list(list(totalEvents = "19670334")), maximums = list(
    list(totalEvents = "19670334")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame"), 
    structure(list(month = "03", totalEvents = 19765253, udn = "AE", 
        udn_id = 74415341), row.names = 1L, totals = list(list(
        totalEvents = "19765253")), minimums = list(list(totalEvents = "19765253")), maximums = list(
        list(totalEvents = "19765253")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame"), 
    structure(list(month = "04", totalEvents = 1319087, udn = "AE", 
        udn_id = 74415341), row.names = 1L, totals = list(list(
        totalEvents = "1319087")), minimums = list(list(totalEvents = "1319087")), maximums = list(
        list(totalEvents = "1319087")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame")))

Обновление 2:

dput (month_fetches [[1]])

list(structure(list(month = "02", totalEvents = 19670334, udn = "AE", 
    udn_id = 74415341), row.names = 1L, totals = list(list(totalEvents = "19670334")), minimums = list(
    list(totalEvents = "19670334")), maximums = list(list(totalEvents = "19670334")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame"), 
    structure(list(month = "03", totalEvents = 19765253, udn = "AE", 
        udn_id = 74415341), row.names = 1L, totals = list(list(
        totalEvents = "19765253")), minimums = list(list(totalEvents = "19765253")), maximums = list(
        list(totalEvents = "19765253")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame"), 
    structure(list(month = "04", totalEvents = 1319087, udn = "AE", 
        udn_id = 74415341), row.names = 1L, totals = list(list(
        totalEvents = "1319087")), minimums = list(list(totalEvents = "1319087")), maximums = list(
        list(totalEvents = "1319087")), isDataGolden = TRUE, rowCount = 1L, class = "data.frame"))

1 Ответ

1 голос
/ 05 апреля 2020

Поскольку Map/mapply требует, чтобы все аргументы были одинаковой длины и 'df' с количеством строк 3 и длиной my_dates 31, один из вариантов - l oop над столбцами 'df', а затем выполнить еще l oop внутри Map/mapply

monthly_fetches <- Map(function(x, y) 
                 lapply(my_dates, function(date) my_fetch(x, y, date)),
                    df$unit, d$unit_id)

Или у нас может быть внешний l oop для 'my_dates'

lapply(my_dates, function(date) Map(my_fetch, df$unit, df$unit_id, date))

Обновление

Если нам нужно пропустить два столбца, используйте Map

Map(function(start, end) 
  Map(my_fetch, df$unit, df$unit_id, start, end),  
            monthly_dates$starts, monthly_dates$ends))

Или

monthly_fetches <- Map(function(x, y) Map(function(start, end) 
   my_fetch(x, y, start, end),
      monthly_dates$starts, monthly_dates$ends), df$unit, df$unit_id)

Тогда rbind

do.call(rbind,lapply(monthly_fetches, function(x) do.call(rbind, x)))

Или используйте map

library(purrr)
library(dplyr)
map_dfr(monthly_fetches, bind_rows, .id = 'grp')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...