如何在R dataframe中删除某列包含指定文本的重复观测行
R 数据框筛选实现方案
前置准备(示例数据构造,可跳过)
df <- data.frame( X1 = rep("rs6908903", 5), X10 = c("chr6", "chr6_GL000251v2_alt", "chr6_GL000252v2_alt", "chr6_GL000252v2_alt", "chr6_GL000252v2_alt") )
方法1:基础R实现
无需加载额外包,直接用基础函数处理:
# 第一步:剔除X10含GL000的行,同时保留X10为chr6的行 df_filter <- df[!grepl("GL000", df$X10) & df$X10 == "chr6", ] # 第二步:仅保留第一行 df_new <- df_filter[1, ]
如果需要按X1分组,每个SNP保留第一个符合条件的行,调整为:
df_new <- do.call(rbind, by(df, df$X1, function(sub_df) { sub_df[!grepl("GL000", sub_df$X10) & sub_df$X10 == "chr6", ][1, ] }))
方法2:dplyr 实现(更简洁易读)
library(dplyr) df_new <- df %>% # 剔除含GL000的行,仅保留X10为chr6的行 filter(!grepl("GL000", X10), X10 == "chr6") %>% # 取第一行,旧版本dplyr可替换为slice(1) slice_head(n = 1)
如果需要按X1分组保留每个组的第一个符合条件的行,加group_by即可:
df_new <- df %>% group_by(X1) %>% filter(!grepl("GL000", X10), X10 == "chr6") %>% slice_head(n = 1) %>% ungroup()
输出结果验证
对示例数据处理后,最终输出为:
X1 X10 1 rs6908903 chr6
完全符合需求。
内容的提问来源于stack exchange,提问作者Mahan
相关产品推荐
相关产品推荐

