R语言按PNR分组比较相邻行列值新增R/O标识列如何实现
R实现分组新增往返标记列的解决方案
你提供的初始示例数据代码如下:
data <- data.frame( Details = c("PNR1", "PNR1", "PNR11", "PNR2", "PNR2"), FromCity = c("MAA", "BLR", "DEL", "TRV", "HYD"), ToCity = c("BLR", "MAA", "MAA", "HYD", "TRV") )
方法1:使用dplyr包(推荐,语法简洁易读)
核心用dplyr的分组 + 偏移函数lead()实现逻辑,无需手动写循环:
library(dplyr) data <- data %>% group_by(Details) %>% mutate( # 取当前行下一行的ToCity值,每组最后一行默认返回NA next_ToCity = lead(ToCity, default = NA), # 按规则判断,NA(每组最后一行)直接赋值为O flag = ifelse(FromCity == next_ToCity, "R", "O") ) %>% # 可选:删除辅助列next_ToCity select(-next_ToCity) %>% ungroup()
运行后输出结果如下:
Details FromCity ToCity flag <chr> <chr> <chr> <chr> 1 PNR1 MAA BLR R 2 PNR1 BLR MAA O 3 PNR11 DEL MAA O 4 PNR2 TRV HYD R 5 PNR2 HYD TRV O
如果需要和你提供的预期dput结构匹配,把初始数据的PNR11改为PNR1即可,逻辑完全通用。
方法2:Base R实现(无需额外安装包)
用ave()函数实现分组计算,逻辑和上面一致:
data$flag <- ave( seq(nrow(data)), data$Details, FUN = function(idx) { next_ToCity <- data$ToCity[idx + 1] ifelse(data$FromCity[idx] == next_ToCity, "R", "O") } )
两种方法都可以替代手动遍历factor的实现,效率更高代码更简洁。
内容的提问来源于stack exchange,提问作者Prabhu
相关产品推荐
相关产品推荐

