获取r数据帧的每个组内的排名

问题描述 投票:0回答:2

我在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
r dataframe ranking
2个回答
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)


0
投票

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

   dat_sorted$Rank <- seq.int(nrow(dat_sorted)) 
© www.soinside.com 2019 - 2024. All rights reserved.