我在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
看起来人们忘记了你的问题。希望这不会太晚^^
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)
我猜你需要一个行号列,因为数据帧已经按降序排序。因此,最高排名将位于顶部,最低排名位于底部。在这种情况下,只需添加一个序列号列作为Rank。如下所示:
dat_sorted$Rank <- seq.int(nrow(dat_sorted))