dplyr 如何解析具有相同值的查询

How does dplyr resolves the queries with the same values

我有一个包含四列的数据框,我感兴趣的是 select 基于最小 "evalue"

的最佳 "Query_id"

这是我的数据框的样子:

  Query_id        Subject_id percent_identity  evalue 
1    35538      contig404347              100 4.6e+00 
2    35538 GeneScaffold_1991              100 4.6e+00 
3    35539 GeneScaffold_2894              100 6.0e-18 
4    35539 GeneScaffold_3680              100 4.6e+00 
5    35540  GeneScaffold_530              100 8.0e-16 
6    35540      contig456880              100 1.3e+00 

这是dplyr代码

newdata <- as.data.frame(group_by(data, Query_id) %>% 
  summarise(
      Subject_id = Subject_id[1], 
      percent_identity = percent_identity[1], 
      evalue = min(evalue))

我得到这个输出

  Query_id        Subject_id  percent_identity  evalue
1    35538      contig404347           100.00  4.6e+00
2    35539 GeneScaffold_2894           100.00  6.0e-18
3    35540  GeneScaffold_530           100.00  8.0e-16

查询 ID 的 3559 和 35540 没问题,符合预期,但是 35538​​ 怎么样。尽管两个 ID 的评估值相同,但它只 select 编辑了第一个。这是 dplyr 的默认行为吗?

dplyr无关 - 仅"selected the first one".

回想一下 summarizedplyr return 的一行, 决定 return Subject_id[1] 为主题 ID(即使这不符合最小值 evalue!)。同样,min(evalue) return 是(单个)最小值 evalue

如果您希望 return 所有获得最小值的行,请尝试

data %>%
  group_by(Query_id) %>%
  filter(evalue==min(evalue))

你的数据帧的每一位和 returns all 行的子集具有最小 evalue.

或者如果您只想为每个最小值选择一行,您可以这样做

data %>% group_by(Query_id) %>% slice(which.min(evalue))

这将 return 达到最小值的行的 第一个 (对于每个 Query_id),其中第一个是 return ed 因为那是 which.min returns(最小值的索引,第一个出现的索引),与 dplyr.

无关