在R语言中如何按分组标记列中首次连续重复的目标值实例?
按组标记首次连续出现的"High"序列
示例数据
首先生成示例数据框:
Group <- c("AGroup", "AGroup", "AGroup", "AGroup", "BGroup", "BGroup", "BGroup", "BGroup", "CGroup", "CGroup", "CGroup", "CGroup") Status <- c("Low", "Low", "High", "High", "High", "Low", "High", "Low", "Low", "Low", "High", "High") df <- data.frame(Group, Status)
期望生成的FirstHighRun列如下(标记首次连续"High"及其后续连续项为1,其余为0):
Group Status FirstHighRun AGroup Low 0 AGroup Low 0 AGroup High 1 AGroup High 1 BGroup High 1 BGroup Low 0 BGroup High 0 BGroup Low 0 CGroup Low 0 CGroup Low 0 CGroup High 1 CGroup High 1
需求说明
按Group分组,将Status列中首次出现的连续"High"值及其后续连续重复的实例标记为1,其余情况标记为0。例如BGroup中第二次出现的"High"因未连续跟随首次出现的"High",故标记为0。
解决方案
使用dplyr结合data.table的rleid函数可以高效实现需求,代码如下:
# 加载必要的包 library(dplyr) library(data.table) # 处理数据生成目标列 result_df <- df %>% group_by(Group) %>% # 为连续相同的Status分配唯一分组ID mutate(rleid = rleid(Status)) %>% # 找到每组中第一个出现"High"的连续组ID mutate(first_high_rleid = min(rleid[Status == "High"], na.rm = TRUE)) %>% # 判断当前行是否属于首次连续High组,且Status为High mutate(FirstHighRun = ifelse(rleid == first_high_rleid & Status == "High", 1, 0)) %>% # 移除中间辅助列 select(-rleid, -first_high_rleid) %>% ungroup() # 查看结果 print(result_df)
逻辑解释
rleid(Status):给连续相同的Status值分配同一个ID,比如AGroup中前两个Low为ID 1,后两个High为ID 2;BGroup中第一个High为ID 1,后续Low为ID 2,第二个High为ID 3。min(rleid[Status == "High"], na.rm = TRUE):提取每组中第一个出现"High"的连续组ID,比如BGroup中首次High的组ID是1,第二次High的组ID是3,因此取1。- 最后通过
ifelse判断:如果当前行的组ID等于首次High的组ID,且Status为High,则标记为1,否则为0,完全匹配需求。
纯dplyr实现方案(无需data.table)
如果不想依赖data.table,可以用纯dplyr代码实现:
library(dplyr) result_df <- df %>% group_by(Group) %>% # 标记是否为High,以及是否与前一行Status相同 mutate(is_high = Status == "High", same_as_prev = Status == lag(Status, default = "")) %>% # 生成连续组ID:每次Status变化时组ID+1 mutate(rleid = cumsum(!same_as_prev)) %>% # 找到首次High的组ID mutate(first_high_rleid = min(rleid[is_high], na.rm = TRUE)) %>% # 生成目标列 mutate(FirstHighRun = ifelse(rleid == first_high_rleid & is_high, 1, 0)) %>% # 清理辅助列 select(-is_high, -same_as_prev, -rleid, -first_high_rleid) %>% ungroup()
内容的提问来源于stack exchange,提问作者GM01
相关产品推荐
相关产品推荐

