R语言dataframe操作:删除delivery=0且下一行delivery=1的对应行
# 补全后的完整原始数据 df <- data.frame( client_id = c(7, 7, 7, 17, 17, 17, 19, 19, 19,19,19), delivery = c(0,0,1,0,0,1,0,0,1,1,1), order_id = c("snshw","nsnsjjw","smssjjw","jsnn","ksksues","ncbf","nsngw","manhsm","opltkg","snsjue","msmssje"), which_order = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5) )
方案1:dplyr实现(逻辑清晰易读)
核心用lead()函数取当前行的下一行delivery值做判断,默认按client_id分组处理避免跨用户的相邻行判断错误:
library(dplyr) df_result <- df %>% group_by(client_id) %>% # 过滤掉"当前delivery为0且下一行delivery为1"的行,默认最后一行下一行值设为0避免误删 filter(!(delivery == 0 & lead(delivery, default = 0) == 1)) %>% ungroup()
如果确认不需要严格按client_id分组,直接删掉group_by(client_id)和对应的ungroup()行即可,逻辑同样生效,执行结果和你给出的预期完全一致。
方案2:base R实现(无需加载第三方包)
用ave()函数按client_id分组做条件判断:
# 生成标记列:TRUE代表需要删除的行 df$to_drop <- ave(df$delivery, df$client_id, FUN = function(x) { x == 0 & c(tail(x, -1), 0) == 1 }) df_result <- df[df$to_drop == FALSE, setdiff(names(df), "to_drop")]
内容的提问来源于stack exchange,提问作者Zofia Smoleń
相关产品推荐
相关产品推荐

