基于规则移除R语言DataFrame行:保留有效通话记录需求
R语言按规则过滤DataFrame记录的实现方案
需求与示例
原DataFrame
df <- data.frame( APPELANT = c("A", "B", "B", "C", "D", "E", "E", "E", "E", "F", "F", "C", "A", "A"), DURATION = c(1, 0, 2, 3, 4, 0, 0, 0, 5, 0, 0, 6, 0, 7), stringsAsFactors = FALSE )
期望结果
APPELANT DURATION 1 A 1 2 B 2 3 C 3 4 D 4 5 E 5 6 F 0 7 C 6 8 A 7
核心规则
- 同一
APPELANT的连续记录中,若后续出现非0时长,移除所有前置0; - 若同一
APPELANT的连续记录全为0,仅保留一条; - 非连续的同一
APPELANT记录需全部保留(代表不同回电场景)
实现方案
方法1:使用dplyr包(tidyverse生态)
library(dplyr) result_df <- df %>% # 为连续相同的APPELANT生成分组ID mutate(grp = consecutive_id(APPELANT)) %>% # 按连续组+APPELANT分组处理 group_by(grp, APPELANT) %>% # 标记组内是否存在非0时长 mutate(has_nonzero = any(DURATION != 0)) %>% # 执行过滤:有非0则保留非0记录,全0则保留第一条 filter(if (has_nonzero) DURATION != 0 else row_number() == 1) %>% # 取消分组并清理辅助列 ungroup() %>% select(-grp, -has_nonzero) # 查看结果 print(result_df)
方法2:使用data.table包(高效处理大数据)
library(data.table) setDT(df) result_df <- df[, .( DURATION = if (any(DURATION != 0)) DURATION[DURATION != 0] else DURATION[1] ), by = .(grp = rleid(APPELANT), APPELANT)] %>% # 调整列顺序至目标格式 select(APPELANT, DURATION) # 查看结果 print(result_df)
内容的提问来源于stack exchange,提问作者user21699241
相关产品推荐
相关产品推荐

