对分组行进行过滤和比较(tidyverse)

问题描述 投票:0回答:1

我有一个数据框,我想找到重复项,然后选择一行或保留多行,具体取决于列条件。

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)
  • 我尝试包含“if 语句”或“case_when”,但我不知道如何比较相邻行

谢谢您的帮助!

r filter group-by conditional-statements tidyverse
1个回答
0
投票

这是我的回答

(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)
)
© www.soinside.com 2019 - 2024. All rights reserved.