You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:18:01