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

R语言tidyverse中mutate未保存新变量,分组求最大日期问题

解决按id和time分组求最新日期的问题

首先,你遇到的「newdate未找到」报错,大概率是因为未加载lubridate包——ymd()是lubridate包的专属函数,如果没提前运行library(lubridate),mutate无法正确生成newdate变量,后续summarize自然找不到它。另外,你的summarize语句没有给结果列命名,建议显式命名以匹配预期输出。

正确的tidyverse实现代码

# 先加载必要的包
library(dplyr)
library(lubridate)

data2 <- data %>%
  select(id, time, date) %>%
  mutate(newdate = ymd(date)) %>%
  group_by(id, time) %>%
  summarize(date = max(newdate))  # 显式命名结果列为date,匹配预期格式

运行后输出结果:

# A tibble: 3 × 3
     id  time date      
  <dbl> <dbl> <date>    
1     1     1 2010-03-01
2     1     2 2010-04-01
3     1     3 2010-05-01

用base R实现的简化方法

如果不想依赖tidyverse系列包,base R的aggregate()函数可以直接完成需求,无需创建中间变量:

# 先将字符型date转为日期格式
data$date <- as.Date(data$date)
# 按id和time分组,提取每组的最大日期
data2 <- aggregate(date ~ id + time, data = data, FUN = max)

运行结果与预期完全一致:

id time       date
1  1    1 2010-03-01
2  1    2 2010-04-01
3  1    3 2010-05-01

关于你遇到的矛盾现象

拆分代码执行时newdate存在,是因为当时你可能已经加载了lubridate包,mutate成功生成了变量;而运行完整代码时如果没加载包,ymd()会静默失败(或报错被忽略),导致newdate未被创建,后续summarize就会提示找不到变量。

内容的提问来源于stack exchange,提问作者Eric Boorman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:37:35