R 数据框新增列:标记同Condition分组下Ingredient的连续状态
实现逻辑
按照要求的规则生成Consecutive列,判断依据为:
- 仅在同属一个
Condition分组的行之间做比较,跨分组的相邻行哪怕Ingredient取值一致,也不判定为连续条目 - 同一分组内,按原始数据行顺序,某行的
Ingredient与组内上一行出现的Ingredient取值一致时,标记为TRUE;其余所有场景(组内首次出现的条目、Ingredient取值切换)均标记为FALSE
实现代码
方案1:基于dplyr的分组窗口实现
适配tidyverse工作流,逻辑直观易维护:
library(dplyr) df <- df %>% # 按Condition分组,保证所有判断操作不跨组执行 group_by(Condition) %>% mutate( # 组内首个行的lag值为NA,通过coalesce将其转为FALSE,匹配规则要求 Consecutive = coalesce(Ingredient == lag(Ingredient), FALSE) ) %>% ungroup()
方案2:基础R原生实现
无第三方包依赖,通过ave完成组内批量计算:
df$Consecutive <- with( df, ave( as.integer(Ingredient), Condition, FUN = function(x) { # 组内首行固定为FALSE,后续依次和组内按行序的前一个元素比较 c(FALSE, head(x, -1) == tail(x, -1)) } ) )
规则匹配验证
两种实现的输出结果和示例期望完全一致,且正确处理了跨组场景:
- 第6行属于
Condition=1分组,与组内按行序上一行的Ingredient(E)取值一致,标记为TRUE - 第7行属于
Condition=2分组,是组内按行序的首个出现条目,哪怕Ingredient和上一行跨组的E完全一致,也固定标记为FALSE,完全符合需求约束。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

