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

在R中为满足条件后的行添加标记的高效实现方法

R中按分组标记首次出现指定值后的所有行的高效方法

你需要按id分组,为每个分组中首次出现value=99的行及其之后的所有行添加标记列new(符合条件为1,否则为0),以下是两种高效实现方式:


方法一:使用dplyr(tidyverse生态)

适合熟悉tidyverse的用户,代码简洁易读:

library(dplyr)

# 构造示例数据
df <- data.frame(
  id = c(1,1,1,1,1,2,2,3,3,3),
  date = c("2026-01-24","2026-01-24","2026-01-24","2026-01-25","2026-01-25",
           "2026-01-24","2026-01-24","2026-01-24","2026-01-25","2026-01-25"),
  time = c("10:52:44","10:54:44","11:05:41","11:52:44","11:58:14",
           "10:02:44","10:22:44","10:52:12","10:52:44","11:12:23"),
  cost = c(234,236,353,5352,143,124,636,53,436,9473),
  value = c(34,68,99,78,99,99,99,75,99,13)
)

# 生成标记列
df_result <- df %>%
  group_by(id) %>%
  mutate(new = as.integer(cummax(value == 99))) %>%
  ungroup()

原理:

  • value == 99生成逻辑向量,首次出现99的位置为TRUE,其余为FALSE
  • cummax()对逻辑向量取累积最大值,一旦遇到TRUE,后续所有值都会保持为TRUE
  • as.integer()将逻辑值转为1/0,得到最终的new列

方法二:使用data.table(大数据量首选)

当处理百万级以上的大型数据集时,data.table的速度和内存效率优势明显:

library(data.table)

# 构造示例数据并转为data.table格式
df <- data.frame(
  id = c(1,1,1,1,1,2,2,3,3,3),
  date = c("2026-01-24","2026-01-24","2026-01-24","2026-01-25","2026-01-25",
           "2026-01-24","2026-01-24","2026-01-24","2026-01-25","2026-01-25"),
  time = c("10:52:44","10:54:44","11:05:41","11:52:44","11:58:14",
           "10:02:44","10:22:44","10:52:12","10:52:44","11:12:23"),
  cost = c(234,236,353,5352,143,124,636,53,436,9473),
  value = c(34,68,99,78,99,99,99,75,99,13)
)
setDT(df)

# 生成标记列(原地修改,节省内存)
df[, new := as.integer(cummax(value == 99)), by = id]

原理:

  • 通过by = id按分组处理
  • 逻辑与dplyr方法一致,cummax()实现累积标记,as.integer()转换为数值
  • data.table采用原地修改的方式,避免额外内存开销,适合大数据场景

两种方法最终输出结果均与你期望的格式完全匹配。

内容的提问来源于stack exchange,提问作者AlexB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 14:54:51