簡體   English   中英

在 R 中創建函數以應用於多個數據集

[英]Create function in R to apply to multiple datasets

我有這個代碼,從 Stackoverflow 用戶推薦,效果很好。 我有幾個數據集,我希望將此代碼應用於。 我是否必須不斷地將每個數據集應用於代碼,或者我還能做些什么? (喜歡將它存儲在某種功能中?)

我有數據集

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

每個數據集的 Dput:

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())

這就是我一直在為每個人做的事情:(等)

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)

任何建議表示贊賞。

我們可以使用mget將所有對象返回到一個list ,使用map循環遍歷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)

或者在循環中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM