r - 使用 dplyr 进行多级排序

标签 r dplyr

我有以下数据框:

tdf <- structure(list(GO = c("Cytokine-cytokine receptor interaction", 
"Cytokine-cytokine receptor interaction|Endocytosis", "I-kappaB kinase/NF-kappaB signaling", 
"NF-kappa B signaling pathway", "NF-kappaB import into nucleus", 
"T cell chemotaxis"), PosCount = c(17, 18, 4, 5, 1, 2), shortgo = structure(c(1L, 
1L, 2L, 2L, 2L, 3L), .Label = c("z", "X", "y"), class = "factor")), .Names = c("GO", 
"PosCount", "shortgo"), row.names = c(NA, 6L), class = "data.frame")

看起来像这样:

                                                  GO PosCount shortgo
1             Cytokine-cytokine receptor interaction       17       z
2 Cytokine-cytokine receptor interaction|Endocytosis       18       z
3                I-kappaB kinase/NF-kappaB signaling        4       X
4                       NF-kappa B signaling pathway        5       X
5                      NF-kappaB import into nucleus        1       X
6                                  T cell chemotaxis        2       y

然后我想做的是首先按字母顺序按 shortgo 排序 - 不区分大小写 - 然后对每个 shortgo 组在内部按 PosCount。产生这个:

                                                  GO PosCount shortgo
                       NF-kappa B signaling pathway        5       X
                I-kappaB kinase/NF-kappaB signaling        4       X
                      NF-kappaB import into nucleus        1       X
                                  T cell chemotaxis        2       y
 Cytokine-cytokine receptor interaction|Endocytosis       18       z
             Cytokine-cytokine receptor interaction       17       z

但是为什么这不起作用:

library(dplyr)
tdf[order(tdf$shortgo),]
tdf <- tdf %>% group_by(shortgo) %>% arrange(desc(PosCount))

正确的做法是什么?

最佳答案

您只需将它们组合成一个调用即可。尽管您需要先将 shortgo 转换为 character 类(解释见下文)

tdf %>% 
    arrange(as.character(shortgo), desc(PosCount))
#                                                   GO PosCount shortgo
# 1                       NF-kappa B signaling pathway        5       x
# 2                I-kappaB kinase/NF-kappaB signaling        4       x
# 3                      NF-kappaB import into nucleus        1       x
# 4                                  T cell chemotaxis        2       y
# 5 Cytokine-cytokine receptor interaction|Endocytosis       18       z
# 6             Cytokine-cytokine receptor interaction       17       z

所以你需要转换为字符的原因是因为 shortgo 是一个因子,它基本上是一个具有 levelsinteger 向量属性。所以 order 使用这些整数来对你的向量进行排序。在您的情况下,整数不对应于正确的级别顺序

tdf$shortgo
## [1] z z x x x y
## Levels: z x y
as.numeric(tdf$shortgo)
## [1] 1 1 2 2 2 3

所以你可以看到 z 编码为 1,x 编码为 2,y 编码为 3,而它应该是 3, 2, 1. 因此 sort 返回“错误”结果

sort(tdf$shortgo)
# 1] z z x x x y
# Levels: z x y

比较

test <- factor(sort(as.character(tdf$shortgo)))
sort(test)
## [1] x x x y z z
## Levels: x y z

关于r - 使用 dplyr 进行多级排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914924/

相关文章:

r - 如何绘制 R 中的关系?

r - 如何在 RStudio Markdown 中编译 pdf?

r - 52周x轴ggplot2起点

r - 使用过滤器的最小值或最大值

r - 嵌套列表 "addition"

r - 如何将 R Shiny 演示文稿导出为 pdf 或 html

regex - 在字符串中的第一个逗号处拆分

dplyr 中的 rowMeans 函数

r - 在 r 中的矩阵/数据框中向下移动一行

r - 简单问题(我认为) - 通过插入符号包在 KNN 中使用 F1 分数指标