dplyr如何使用相同的值解析查询

时间:2015-07-23 05:01:39

标签: r dplyr

我有一个包含四列的数据框,我感兴趣的是选择最好的" Query_id"基于最小值" evalue"

以下是我的数据框的样子:

  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的evalue相同,它也只选择了第一个。这是dplyr的默认行为吗?

1 个答案:

答案 0 :(得分:2)

它与dplyr无关 - 你只有&#34;选择第一个&#34;。

回想一下,summarize中的dplyr会返回一行,而决定返回Subject_id[1]作为主题ID(即使这不符合最低evalue!)。同样,min(evalue)会返回(单个)最小值evalue

如果您希望返回达到最小evalue的所有行,请尝试

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

对数据框的每个位进行子集,并返回所有行,且最小为evalue

或者,如果您想为每个最小evalue选择一行,则可以

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

将返回达到最小值(对于每个Query_id)的第一个,其中第一个返回,因为这是which.min返回的(索引)最小的,第一个发生的),与dplyr无关。