R语言按年份和分组计算组内日期间隔均值报错解决
报错根因
触发non-numeric argument to binary operator报错的核心原因是同名函数冲突:R基础包stats自带的lag()是为时间序列对象设计的,如果你没有明确指定调用dplyr版本的lag,该函数会被优先调用,它无法正确处理Date类型的列,返回值和原Date类型不匹配,做减法运算时就会抛出该错误。
另外你的代码还缺了分组内排序的步骤,就算不报错,日期顺序混乱时计算出的相邻间隔也没有实际意义。
可直接运行的正确代码
library(dplyr) data_meandays <- data %>% group_by(year, group) %>% # 分组内按日期升序排序,保证计算的是时间先后顺序的相邻间隔 arrange(date, .by_group = TRUE) %>% # 明确调用dplyr的lag避免函数冲突;转数值直接得到天为单位的间隔 mutate(diff_days = as.numeric(date - dplyr::lag(date))) %>% # 汇总计算均值,na.rm去掉每个分组第一行的NA值 summarize(mean_interval_days = mean(diff_days, na.rm = TRUE), .groups = "drop")
对应测试数据集的运行结果
- 2019年A组:相邻间隔为10天、7天,平均间隔8.5天
- 2019年B组:相邻间隔为15天,平均间隔15天
- 2020年A组:相邻间隔为2天,平均间隔2天
- 2020年B组:相邻间隔为19天、5天,平均间隔12天
注意:
as.numeric()处理Date差值是为了把默认的difftime时间差对象转成纯数值,避免后续运算出现单位不统一的问题。
内容的提问来源于stack exchange,提问作者novice_coder
相关产品推荐
相关产品推荐

