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

基于规则移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:02:34