Создать функцию в R для применения к нескольким наборам данных - PullRequest
1 голос
/ 31 марта 2020

У меня есть этот код, рекомендованный пользователем Stackoverflow, который работает очень хорошо. У меня есть несколько наборов данных, к которым я буду sh применять этот код. Придется ли мне постоянно применять каждый набор данных к коду или есть что-то еще, что я могу сделать? (Например, сохранить его в какой-то функции?)

У меня есть наборы данных

df1, df2, df3, df4. I do not wish to rbind these datasets.

Данные для каждого набора данных:

structure(list(Date = structure(1:6, .Label = c("1/2/2020 5:00:00 PM", 
"1/2/2020 5:30:01 PM", "1/2/2020 6:00:00 PM", "1/5/2020 7:00:01 AM", 
"1/6/2020 8:00:00 AM", "1/6/2020 9:00:00 AM"), class = "factor"), 
Duration = c(20L, 30L, 10L, 5L, 2L, 8L)), class = "data.frame", row.names = c(NA, 
-6L))

КОД:

df %>%
group_by(Date = as.Date(dmy_hms(Date))) %>% 
summarise(Total_Duration = sum(Duration), Count = n())

Это то, что я делал для каждого: (et c)

df1 %>%
group_by(Date = as.Date(dmy_hms(Date))) %>% 
summarise(Total_Duration = sum(Duration), Count = n())


df2 %>%
group_by(Date = as.Date(dmy_hms(Date))) %>% 
summarise(Total_Duration = sum(Duration), Count = n())


df3 %>%
group_by(Date = as.Date(dmy_hms(Date))) %>% 
summarise(Total_Duration = sum(Duration), Count = n())

Есть ли способ:

 Store_code<-
 df %>%
 group_by(Date = as.Date(dmy_hms(Date))) %>% 
 summarise(Total_Duration = sum(Duration), Count = n())

и затем легко применить каждый набор данных к этому коду?

df1(Store_code)
df2(Store_code)

Любое предложение приветствуется.

1 Ответ

1 голос
/ 31 марта 2020

Мы можем использовать mget, чтобы вернуть все объекты в list, использовать map до l oop над list и применить функцию

library(dplyr)
library(lubridate)
library(purrr)
f1 <- function(dat) {
      dat %>%
        group_by(Date = as.Date(dmy_hms(Date))) %>% 
         summarise(Total_Duration = sum(Duration), Count = n())
      }

lst1 <- map(mget(ls(pattern = "^df\\d+$")), f1)

Здесь мы предполагаем, что имена столбцов одинаковы, то есть «Дата», «Продолжительность» во всех наборах данных. Если это другой, он может передать в качестве другого аргумента функцию

f2 <- function(dat, datecol, durationcol) {
      dat %>%
        group_by(Date = as.Date(dmy_hms({{datecol}}))) %>% 
         summarise(Total_Duration = sum({{durationcol}}), Count = n())
      }

и применить функцию как

f2(df1, Date, Duration)

Или в l oop

lst1 <- map(mget(ls(pattern = "^df\\d+$")), f2, 
         datecol = Date, durationcol = Duration)
...