获取 r 数据框在每个组中的排名

Get ranking within each group for r dataframe

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

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

我现在想做的是向 dat_sorted 添加一个 Rank 列,这将根据 Expression 值在每个 Gene 组中应用排名,例如也就是说,对于给定的基因,如果给定的样本的表达更高,则给定的样本将具有更高的等级。

下面是结果的示例:

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

我想您需要一个行号列,因为数据框已经按降序排序。因此,最高等级将在顶部,最低等级将在底部。在这种情况下,只需添加一个序列号列作为 Rank。如下所示:

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

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

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)