如何在R中创建新列识别零值间的序列分组
R语言实现序列分组列生成
根据需求,我们需要基于Conversions列生成分组列,规则是从一个起始值(无论0或1)到下一个触发分组变更的0之间的所有行归为同一组,仅当Conversions从1切换为0时,分组才递增。以下是两种实现方式:
方法一:使用dplyr包(tidyverse风格)
加载dplyr后,通过标记分组触发点、累加触发次数生成分组:
library(dplyr) # 场景一数据处理 df1 <- tibble(Conversions = c(1,1,0,1,1,1,0,1,1,0,0,0,1,1,1,0,0)) %>% mutate( # 标记分组递增触发点:当前为0且前一行不为0 trigger = ifelse(row_number() == 1, FALSE, Conversions == 0 & lag(Conversions) != 0), `New Column (The Sequence)` = cumsum(trigger) + 1 ) # 场景二数据处理 df2 <- tibble(Conversions = c(0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,1,1)) %>% mutate( trigger = ifelse(row_number() == 1, FALSE, Conversions == 0 & lag(Conversions) != 0), `New Column (The Sequence)` = cumsum(trigger) + 1 )
方法二:使用Base R(无需额外包)
利用diff()函数检测从1到0的切换,再通过cumsum()生成分组:
# 场景一处理 conversions1 <- c(1,1,0,1,1,1,0,1,1,0,0,0,1,1,1,0,0) # 生成触发标志:diff为-1表示从1变为0 trigger1 <- c(FALSE, diff(conversions1) == -1) group1 <- cumsum(trigger1) + 1 df1_base <- data.frame(Conversions = conversions1, `New Column (The Sequence)` = group1) # 场景二处理 conversions2 <- c(0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,1,1) trigger2 <- c(FALSE, diff(conversions2) == -1) group2 <- cumsum(trigger2) + 1 df2_base <- data.frame(Conversions = conversions2, `New Column (The Sequence)` = group2)
两种方法生成的分组列均与示例完全匹配。
内容的提问来源于stack exchange,提问作者Wecsley Prates
相关产品推荐
相关产品推荐

