我有一个包含四列的数据框,我感兴趣的是选择最好的" 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
的默认行为吗?
答案 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
无关。