使用R统计数据框中连续年月内重复出现的名称及次数
解决方法(R语言)
核心思路
- 按年月从新到旧排序数据,确保检查顺序符合需求
- 去重每个年月下的唯一名称,避免重复计数干扰结果
- 对每个名称,从最新年月开始依次验证是否连续出现,遇到未出现的年月即停止统计
- 筛选出连续出现次数达标(示例为≥2次)的名称
代码实现
先加载依赖包:
library(dplyr) library(zoo)
1. 示例数据(替换为你的实际数据即可)
df <- tibble( d = as.yearmon(c("Oct 2020", "Oct 2020", "Nov 2020", "Nov 2020", "Sep 2020", "Sep 2020")), x = c("bpa", "db", "bpa", "db", "svc", "bpa") )
2. 预处理与连续次数计算
# 去重每个年月的唯一名称,并按年月从新到旧排序 unique_x_per_month <- df %>% distinct(d, x) %>% arrange(desc(d)) # 获取排序后的完整年月序列 sorted_months <- unique(unique_x_per_month$d) # 统计每个名称的连续出现次数 result <- unique_x_per_month %>% group_by(x) %>% mutate( # 收集当前名称出现过的所有年月(从新到旧排序) x_months = list(sort(d, decreasing = TRUE)) ) %>% mutate(consecutive_count = map_int(x_months, ~{ count <- 0 # 从最新年月开始依次检查是否存在 for(m in sorted_months){ if(m %in% .x){ count <- count + 1 } else { break # 遇到未出现的年月,终止计数 } } count })) %>% # 筛选连续次数≥2的结果,去重并按次数排序 filter(consecutive_count >= 2) %>% distinct(x, consecutive_count) %>% arrange(desc(consecutive_count))
结果说明
运行代码后,result会输出符合要求的结果:
bpa在Nov 2020、Oct 2020、Sep 2020连续出现,次数为3db在Nov 2020、Oct 2020连续出现,次数为2svc因未出现在最新的Nov 2020,被排除
该方案支持动态处理任意数量的年月,无需提前指定固定的月份范围。
内容的提问来源于stack exchange,提问作者Rupaa Ramesh
相关产品推荐
相关产品推荐

