R中使用dplyr/tidyverse为50个州保留各月最高值的方法
实现方案
你可以使用tidyverse生态下的dplyr和lubridate包的函数完成需求,核心用到的函数如下:
- 分组函数:
group_by() - 字段加工函数:
mutate() - 排序函数:
arrange() - 分组切片函数:
slice_tail() - 日期提取函数(lubridate包提供):
year()、month()
具体实现代码
假设你的数据集命名为us_state_cum_data,包含州名字段state、日期字段date(已转换为Date格式)、累计指标字段cum_value,完整代码如下:
# 加载tidyverse(已内置dplyr、lubridate) library(tidyverse) result <- us_state_cum_data %>% # 提取年月信息,避免不同年份的同月被错误合并 mutate( data_year = year(date), data_month = month(date) ) %>% # 按州、年、月分组 group_by(state, data_year, data_month) %>% # 分组内按日期升序排序,保证最后一行是当月最新记录 arrange(date, .by_group = TRUE) %>% # 取每个分组的最后1行,即为当月该州最高累计值 slice_tail(n = 1) %>% # 可选:移除临时生成的年月字段 ungroup() %>% select(-data_year, -data_month)
补充说明
如果你的数据集已经提前完成排序、且已经内置年月字段,也可以省略mutate()和arrange()步骤,直接分组后调用slice_tail(n=1)即可。
内容的提问来源于stack exchange,提问作者speeeZy
相关产品推荐
相关产品推荐

