如何在R中合并数据框特定列的连续指定内容重复行
解决R语言中仅合并特定连续重复行的问题
这问题很常见,我给你两种常用的解法,一种用dplyr(tidyverse生态工具),另一种用base R原生函数,你可以根据自己的习惯选择:
1. 使用dplyr的解法
首先我们先构造你提供的示例数据框,然后通过分组和条件判断来筛选需要保留的行:
library(dplyr) # 构建示例数据框 df <- tibble( user = c(1, 1, 1, 1, 2, 2, 2, 2, 2), action = c("A", "A", "B", "B", "A", "C", "C", "A", "A") ) # 核心处理逻辑 result <- df %>% group_by(user) %>% # 按user分组,保证每个用户的动作序列独立处理 mutate( # 标记需要保留的行: # - 如果动作不是"A",直接保留 # - 如果动作是"A",仅当它是组内第一行,或者和上一行动作不同时保留 keep = ifelse(action == "A", row_number() == 1 | action != lag(action, default = ""), TRUE) ) %>% filter(keep) %>% # 筛选出标记为保留的行 select(-keep) %>% # 移除辅助列 ungroup() # 取消分组 # 查看结果 print(result)
运行后就能得到你期望的输出:
# A tibble: 7 × 2 user action <dbl> <chr> 1 1 A 2 1 B 3 1 B 4 2 A 5 2 C 6 2 C 7 2 A
2. 使用base R的解法
如果你不想加载额外包,用base R的ave函数也能实现:
# 构建示例数据框 df <- data.frame( user = c(1, 1, 1, 1, 2, 2, 2, 2, 2), action = c("A", "A", "B", "B", "A", "C", "C", "A", "A") ) # 标记需要保留的行 df$keep <- with(df, ave(action, user, FUN = function(x) { # 逻辑和dplyr一致:非"A"直接保留,"A"仅当和前一行不同时保留 x != "A" | c(TRUE, x[-1] != x[-length(x)]) })) # 筛选结果并移除辅助列 result_base <- df[df$keep == TRUE, -3] # 查看结果 print(result_base)
两种方法的核心逻辑是一致的:仅对动作"A"的连续重复行去重,其他动作的连续重复行保持原样,并且按user分组处理,避免跨用户的动作被误处理。
内容的提问来源于stack exchange,提问作者Cina
相关产品推荐
相关产品推荐

