如何编写if语句输出R dataframe中重复Peptide对应的整行数据
解决思路及实现代码
问题根源
你当前代码仅输出Peptide列的原因是赋值时仅提取了dataframe$Peptide[i]单列值,同时循环逻辑存在边界溢出问题(i遍历到最后一行时i+1超出数据行数),且for循环遍历6万行数据效率极低。
最优实现方案(基础R单行代码搞定,效率最高)
核心逻辑:通过duplicated()函数标记所有出现过至少2次的Peptide对应的所有行,直接筛选即可:
# 只要Peptide出现次数≥2,对应的所有行都会被保留 new_res <- dataframe[duplicated(dataframe$Peptide) | duplicated(dataframe$Peptide, fromLast = TRUE), ]
运行后new_res就是你需要的包含完整行的结果。
如果你要修改原有for循环(不推荐,效率低)
将存储结构改为data.frame,赋值时取整行,同时规避边界问题:
new_res <- data.frame() # 循环到倒数第一行就停止,避免i+1越界 for (i in 1:(nrow(dataframe)-1)) { if(isTRUE(dataframe$Peptide[i+1] == dataframe$Peptide[i])) { # 避免同一行被重复添加 if (!i %in% rownames(new_res)) { new_res <- rbind(new_res, dataframe[i, ]) } if (!(i+1) %in% rownames(new_res)) { new_res <- rbind(new_res, dataframe[i+1, ]) } } }
tidyverse风格实现(可读性高)
如果你习惯用dplyr处理数据,可以用分组过滤的逻辑:
library(dplyr) new_res <- dataframe %>% group_by(Peptide) %>% filter(n() >= 2) %>% # 保留Peptide出现次数≥2的所有行 ungroup()
内容的提问来源于stack exchange,提问作者Molly K
相关产品推荐
相关产品推荐

