我有一年收集的数据,但按月细分。对于我的代码,我为每个相应的月份标记了 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”的方法应用于“字符”类的对象。如上所述 - 如果我单独完成并执行此操作,我不会收到此错误消息,但是有很多个月和很多年需要分析,从时间角度来看,我认为手动执行此代码是不可行的。感谢您的帮助
答案 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