使用dplyr结合lead/lag处理重复行并替换PeakType值
DataFrame重复行的PeakType补全与去重实现方案
针对你描述的场景——大型DataFrame中部分行因UnionChr、UnionStart、UnionEnd三列重复形成行组,组内一行PeakType为WT Specific/DKO Specific、另一行为N/A,需要保留含有效Intersect信息的行、补全其PeakType的N/A并移除重复行,以下是基于dplyr的实现代码:
方案一:基于组内有效值提取(更稳健)
test <- df %>% # 按重复列分组 group_by(UnionChr, UnionStart, UnionEnd) %>% # 提取组内非NA的PeakType有效值 mutate(group_valid_peak = first(na.omit(PeakType))) %>% # 替换当前行PeakType的NA为组内有效值 mutate(PeakType = ifelse(is.na(PeakType), group_valid_peak, PeakType)) %>% # 筛选含有效Intersect信息的行(需根据实际定义调整,示例为Intersect非NA) filter(!is.na(Intersect)) %>% # 移除临时辅助列 select(-group_valid_peak) %>% # 取消分组 ungroup()
方案二:基于lead/lag函数(符合指定函数要求)
如果必须使用lead/lag处理行顺序不确定的重复行,可采用以下逻辑:
test <- df %>% group_by(UnionChr, UnionStart, UnionEnd) %>% # 根据前后行补全PeakType的NA mutate(PeakType = case_when( # 非NA值直接保留 !is.na(PeakType) ~ PeakType, # 当前行NA,优先取后一行的有效值 is.na(PeakType) & !is.na(lead(PeakType)) ~ lead(PeakType), # 当前行NA,取前一行的有效值 is.na(PeakType) & !is.na(lag(PeakType)) ~ lag(PeakType), # 非重复行的NA保持原样 TRUE ~ PeakType )) %>% # 筛选含有效Intersect信息的行 filter(!is.na(Intersect)) %>% ungroup()
关键说明
- 分组逻辑:严格按
UnionChr、UnionStart、UnionEnd分组,确保仅处理目标重复行组 - 补全逻辑:仅将重复行组内的
PeakTypeNA替换为同组有效值,非重复行的NA不受影响 - 筛选条件:
filter(!is.na(Intersect))需根据你对“有效Intersect信息”的实际定义调整(比如特定字符串、非空值等)
内容的提问来源于stack exchange,提问作者ispeakcat
相关产品推荐
相关产品推荐

