如何在分组后为DataFrame中每个分组保留恰好两条重复记录?
问题:保留每个物种重复DNA序列的前两条
现有一个包含ID、species(物种名称)和sequence(DNA序列)的DataFrame,其中部分物种存在重复的DNA序列。需求是:对每个物种的每条重复序列,恰好保留两条记录(可选择保留前两条,或随机选取均可)。
目前已实现保留每条重复序列仅一条记录的dplyr代码如下:
library(dplyr) df_filtered <- df %>% group_by(species, sequence) %>% slice(1) %>% ungroup()
询问如何修改上述代码以实现保留两条重复序列的需求,预期输出示例如下:
| ID | species | sequence |
|---|---|---|
| 001 | Species A | ATGTAGCTCAGC |
| 003 | Species A | ATGTAGCTCAGC |
| 004 | Species B | CGCGCGATATTA |
| 005 | Species B | AAACGGCCAATC |
| 006 | Species C | TGTCGGCTCGTC |
| 007 | Species D | ATGTAGCTCAGC |
| 008 | Species E | GCGCGGAGATTT |
| 009 | Species E | GCGCGGAGATTT |
| 010 | Species E | AACTCTATATAT |
| 011 | Species F | ATCGTAGCCTTG |
| 012 | Species F | GGGCGCGCGGCG |
| 014 | Species F | ATCGTAGCCTTG |
解决方案
只需修改slice()相关函数的参数即可实现需求:
1. 保留每组的前两条记录
将原代码中的slice(1)改为slice(1:2),这样每个分组(同一物种的同一条序列)会保留前两行记录:
library(dplyr) df_filtered <- df %>% group_by(species, sequence) %>% slice(1:2) %>% # 修改此处,取前两条 ungroup()
2. 随机选取每组的两条记录
如果需要随机选取而非固定取前两条,可以使用slice_sample()函数并指定n=2:
library(dplyr) df_filtered <- df %>% group_by(species, sequence) %>% slice_sample(n = 2) %>% # 随机选取两条 ungroup()
说明:group_by(species, sequence)的作用是将数据按物种和DNA序列分组,确保操作针对同一物种的同一条重复序列进行,完全匹配需求中的要求。
内容的提问来源于stack exchange,提问作者tadeufontes
相关产品推荐
相关产品推荐

