在多个数据帧上使用 group_by() 函数?

时间:2021-06-09 21:25:41

标签: r dplyr

我有一年收集的数据,但按月细分。对于我的代码,我为每个相应的月份标记了 df1-df12。我正在尝试使用 group_by 函数对这些数据进行分组,以类似地对所有数据帧进行分组。当我执行以下代码时 - 它单独工作正常:

  df <- df %>%
  group_by(date,id) %>%
  slice(n()) %>%
  ungroup()

但是,我想简化此代码,以便我可以对所有 12 个数据帧使用此功能,而无需复制/粘贴 12 次,因为要处理大量数据。这是我为此所做的尝试:

func1<-function(df)
  {
  df <- df %>%
  group_by(date,id) %>%
  slice(n()) %>%
  ungroup()
  }
yr19<-c(df1, df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12)
map(yr19, func1)

但是,我收到以下错误消息:在 UseMethod("group_by") 中出错: 没有适用于“group_by”的方法应用于“字符”类的对象。如上所述 - 如果我单独完成并执行此操作,我不会收到此错误消息,但是有很多个月和很多年需要分析,从时间角度来看,我认为手动执行此代码是不可行的。感谢您的帮助

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题,首先使用@ktiu 建议的方法:

## Create example data
library(dplyr)  # for pipe and group_by()

set.seed(914)
df1 <- tibble(
      date = sample(1:30, 50, replace = T),
      id = sample(1:10, 50, replace = T),
      var1 = rnorm(50, mean = 10, sd = 3)
)

df2 <- tibble(
      date = sample(1:30, 50, replace = T),
      id = sample(1:10, 50, replace = T),
      var1 = rnorm(50, mean = 10, sd = 3)
)

修改您的函数以解决错误

func1<-function(df)
{
      df <- df %>%
            group_by(date,id) %>%
            slice(n()) %>%
            ungroup()
      df
}

## And using list rather than c to combine data frames.
yr19 <- list(df1, df2)
yr19_data <- lapply(yr19, func1)

# This will return a list of data frames you can access with `yr19_data[[1]]`

另一种方法是为源数据框添加变量,然后将其全部折叠成一个数据框并从那里进行操作。哪种方法更有意义取决于您以后还想做什么。

func2 <- function(df.name){
      mutate(get(df.name), source = df.name)
}
# This is set up to get objects given their names, so we'll use a character vector
# of names to iterate off of. 
yr19 = c("df1", "df2")
df.list <- lapply(yr19, func2)
df.long <- do.call(bind_rows, df.list)
df.long
# # A tibble: 100 x 4
# date    id  var1 source
# <int> <int> <dbl> <chr> 
# 1    27     9  9.31 df1   
# 2     5     3 16.5  df1   
# 3    28     3  2.67 df1   
# 4    24     4  8.94 df1   
# 5    13     3  1.68 df1   

此时您可以操作原始管道中的一个数据框:

df <- df.long %>%
      group_by(source, date,id) %>%
      slice(n()) %>%
      ungroup()
df

# # A tibble: 93 x 4
# date    id  var1 source
# <int> <int> <dbl> <chr> 
# 1     1     8  9.89 df1   
# 2     2     4 10.9  df1   
# 3     4     3  8.45 df1   
# 4     5     3 16.5  df1   
# 5     5     7 10.6  df1   
相关问题