R语言如何按MAT分组统计STATUS列连续序列长度并输出为数据框
解决方法
以下提供两种常用实现方案,均会输出包含MAT.、lengths(连续序列长度)、values(对应STATUS取值)三列的结果数据框:
方案1:tidyverse 生态实现(代码更简洁易读)
# 加载依赖包 library(dplyr) library(tidyr) result <- df_group_MAT %>% # 先按MAT和日期排序,保证连续统计的顺序和时间顺序一致 arrange(MAT., DATA) %>% group_by(MAT.) %>% summarise( # 对每个分组的STATUS执行rle,转换为数据框后存入列表 rle_result = list(as.data.frame(unclass(rle(STATUS)))) ) %>% # 展开嵌套的统计结果 unnest(rle_result)
方案2:Base R 实现(无需加载第三方包)
# 按MAT和日期排序,避免原数据顺序混乱影响统计 df_sorted <- df_group_MAT[order(df_group_MAT$MAT., df_group_MAT$DATA), ] # 按MAT分组 df_grouped <- split(df_sorted, df_sorted$MAT.) # 遍历每个分组计算rle,合并为最终数据框 result <- do.call(rbind, lapply(names(df_grouped), function(mat_id) { rle_obj <- rle(df_grouped[[mat_id]]$STATUS) data.frame( MAT. = as.integer(mat_id), lengths = rle_obj$lengths, values = rle_obj$values ) }))
注意:如果你的原数据已经保证每个MAT分组内的行是按时间升序排列的,可以省略排序步骤,减少运行耗时。
内容的提问来源于stack exchange,提问作者XTZ
相关产品推荐
相关产品推荐

