获取每个组内R数据框的排名

时间:2018-11-27 18:19:58

标签: r dataframe ranking

我在R dat中有一个数据框,其中包含列GeneExpressionSampleID。我所做的是对dat进行排序,以使它按Gene分组,并按以下顺序对每个基因按Expression降序排列:

dat_sorted <- dat %>% select(Gene, Expression, SampleID) %>%
    group_by(Gene) %>% 
    arrange(Gene, desc(Expression))

我现在想做的是在Rank上添加一个dat_sorted列,该列将基于Gene的值在每个Expression组内应用排名,这样,对于给定的基因,如果它的表达更高,则给定的样本将具有更高的排名。

以下是结果显示的示例:

Gene                Expression      Sample      Rank
ENSG00000000003     2.81561500      HSB671      1
ENSG00000000003     2.79336700      HSB431      2
ENSG00000000003     2.40009100      HSB618      3
ENSG00000000938     1.75148448      HSB671      1
ENSG00000000938     1.52182467      HSB670      2
ENSG00000000938     0.83478860      HSB414      3
ENSG00000000938     0.62174432      HSB459      4

2 个答案:

答案 0 :(得分:0)

我猜您需要一个行号列,因为数据框已经按降序排序。因此,最高排名将排在首位,最低排名在底端。在这种情况下,只需将序列号列添加为Rank。如下所示:

   dat_sorted$Rank <- seq.int(nrow(dat_sorted)) 

答案 1 :(得分:0)

看起来像是人们忘记了您的问题。希望这不会太晚^^

library(dplyr)

df %>% group_by(Gene) %>% mutate(Rank = dense_rank(desc(Expression)))

> df
# A tibble: 7 x 4
# Groups:   Gene [2]
  Gene            Expression Sample  Rank
  <chr>                <dbl> <chr>  <dbl>
1 ENSG00000000003      2.82  HSB671     1
2 ENSG00000000003      2.79  HSB431     2
3 ENSG00000000003      2.40  HSB618     3
4 ENSG00000000938      1.75  HSB671     1
5 ENSG00000000938      1.52  HSB670     2
6 ENSG00000000938      0.835 HSB414     3
7 ENSG00000000938      0.622 HSB459     4

或使用基数R:

df$Rank <- ave(-df$Expression, df$Gene, FUN = rank)