R语言按颜色分组计算日期范围问题求助(aggregate等函数报错)
最近我在R里处理数据时遇到个小问题:想按颜色分组计算每组的日期范围,试了group_by()、summarize()和aggregate(),但都没顺利跑通,折腾了好一会儿。
问题详情
我的数据
先贴一下我的数据代码:
df1 <- as.Date(c('Jul 1', 'Jun 26', 'July 5', 'July 15'), format = '%B %d') df2 <- c("red", "blue", "red", "blue") df1 <- data.frame(df1,df2)
期望结果
我想要得到按颜色分组后的日期范围(天数差),大概是这样的:
# Group.1 x [1] 4 red [2] 19 blue
我踩的坑和报错
一开始我写了这段aggregate()代码:
df <- aggregate(df1[,1], list(df1[,2]), as.numeric(max(df1[,1]) - min(df1[,1]), units="days"))
单独测试as.numeric(max(df1[,1]) - min(df1[,1]), units="days")是能得到正确数值的,但一按颜色分组就报错:
Error in match.fun(FUN) : 'as.numeric(max(df1$date) - min(df1$date), units="days")' is not a function, character or symbol
后来我尝试换公式形式写,结果又报了这个错:
Error in match.fun(FUN) : argument "FUN" is missing, with no default
解决方法
后来我搞懂问题出在哪了,给大家分享两个可行的方案:
方案1:用dplyr包(更简洁直观)
如果你习惯用tidyverse系列的包,用group_by()+summarize()就很方便:
library(dplyr) df1 %>% group_by(df2) %>% summarize(date_range = as.numeric(max(df1) - min(df1), units = "days"))
运行后会得到符合预期的结果:
# A tibble: 2 × 2 df2 date_range <chr> <dbl> 1 blue 19 2 red 4
方案2:正确使用base R的aggregate()
之前的问题是我把完整的计算表达式直接传给了FUN参数,但aggregate()的FUN需要是一个函数(或者函数名称)。我们可以先自定义一个计算日期差的函数,再传给它:
# 先定义计算日期范围的函数 date_diff <- function(x) { as.numeric(max(x) - min(x), units = "days") } # 用aggregate分组计算 result <- aggregate(df1 ~ df2, data = df1, FUN = date_diff) # 重命名列来匹配期望的格式 colnames(result) <- c("Group.1", "x") result
运行后就能得到:
Group.1 x 1 blue 19 2 red 4
内容的提问来源于stack exchange,提问作者Luke Holcomb
相关产品推荐
相关产品推荐

