【问题标题】:Create function in R to apply to multiple datasets在 R 中创建函数以应用于多个数据集
【发布时间】:2020-03-30 22:50:01
【问题描述】:

我有这个代码,是 Stackoverflow 用户推荐的,效果很好。我有 我希望将此代码应用到的几个数据集。 我是否必须不断地将每个数据集应用到代码中,或者我还能做些什么? (比如将其存储在某种函数中?)

我有数据集

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

这是我一直在为每个人做的事情:(等等)

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)

欢迎提出任何建议。

【问题讨论】:

    标签: r dplyr tidyverse lubridate


    【解决方案1】:

    我们可以使用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)
    

    【讨论】:

    • 谢谢!所以基本上,就我而言,列表是:map(mget(ls(pattern = "df1,df2,df3")), f1) ??
    • @TanishaHudson pattern = '^df\\d+$'mget(paste0('df', 1:3))
    • 这个好?我会试试的
    • 你好 Akrun,我相信这是成功的,我现在只是不确定如何实际查看数据集以查看它是否有效?
    • 好的,我明白了!这行得通,谢谢!我查看了列表。查看(lst1)
    猜你喜欢
    • 2021-02-08
    • 2020-04-22
    • 1970-01-01
    • 2022-11-28
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多