我有一个数据框,我想找到重复项,然后选择一行或保留多行,具体取决于列条件。
tst <- data.frame(dataset=as.factor(c(rep("DS1", 4), rep("DS2", 3), rep("DS3", 3))),
gene1=c("AAA", "AAA", "AAA", "AAA", "AAA", "AAA", "AAA", "AAA", "AAA", "AAA"),
gene2=c("BBB", "BBB", "BBB", "BBB", "BBB", "BBB", "BBB", "BBB", "BBB", "BBB" ),
confidence=c("high", "low", "medium", "high", "low", "low", "medium", "low", "high", "high"),
dist_g1=c(1, 1, 3, 1, 0,0,0,6,6,0),
dist_g2=c(0, 0, 0, 2, 0,0,0,4,4,12) )
数据集 | 基因1 | 基因2 | 信心 | 距离_g1 | 距离_g2 | |
---|---|---|---|---|---|---|
1 | DS1 | AAA | BBB | 高 | 1 | 0 |
2 | DS1 | AAA | BBB | 低 | 1 | 0 |
3 | DS1 | AAA | BBB | 中 | 3 | 0 |
4 | DS1 | AAA | BBB | 高 | 1 | 2 |
5 | DS2 | AAA | BBB | 低 | 0 | 0 |
6 | DS2 | AAA | BBB | 低 | 0 | 0 |
7 | DS2 | AAA | BBB | 中 | 0 | 0 |
8 | DS3 | AAA | BBB | 低 | 6 | 4 |
9 | DS3 | AAA | BBB | 高 | 6 | 4 |
10 | DS3 | AAA | BBB | 高 | 0 | 12 |
我需要修改重复的行(按“数据集”、“基因1”、“基因2”分组),如下所示:
如果在一组中,每个距离都相同,(例如行(1 & 2)、(5、6 & 7)、(8 & 9))但“置信度”不同,保留最高的行置信度(高 > 中 > 低)-> 保留第 1、7、9 行
如果分组中的距离不同,则保留该组中的所有不同行(例如行 (1, 3, 4), (5), (9, 10))
最终的数据框如下所示: (请忽略索引列,它只是为了更好地解释)
--- | 数据集 | 基因1 | 基因2 | 信心 | 距离_g1 | 距离_g2 |
---|---|---|---|---|---|---|
1 | DS1 | AAA | BBB | 高 | 1 | 0 |
3 | DS1 | AAA | BBB | 中 | 3 | 0 |
4 | DS1 | AAA | BBB | 高 | 1 | 2 |
7 | DS2 | AAA | BBB | 中 | 0 | 0 |
9 | DS3 | AAA | BBB | 高 | 6 | 4 |
10 | DS3 | AAA | BBB | 高 | 0 | 12 |
我尝试过的:
tst %>%
mutate(confidence = factor(confidence, levels = c("low", "medium", "high"), ordered = TRUE)) %>%
group_by(dataset, gene1, gene2) %>%
top_n(n=1, confidence)
谢谢您的帮助!
这是我的回答
(tst
%>%
mutate(
confidence = factor(confidence, levels = c("low", "medium", "high"), ordered = TRUE)
)
%>%group_by(dataset, gene1, gene2,dist_g1,dist_g2)
%>% mutate(
order_conf=case_when(
confidence == 'low' ~ 1L,
confidence == 'medium' ~ 2L,
confidence == 'high' ~ 3L,
.default = 1L
),
max_order_conf=max(order_conf)
)
%>% filter(order_conf==max_order_conf)
%>% select (-max_order_conf,-order_conf)
)