我在R dat
中有一个数据框,其中包含列Gene
,Expression
和SampleID
。我所做的是对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
答案 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)