首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据列表排序列,然后排序数据帧中的另一列

根据列表排序列,然后排序数据帧中的另一列
EN

Stack Overflow用户
提问于 2015-05-05 03:58:42
回答 1查看 60关注 0票数 4

我有以下数据框架:

代码语言:javascript
复制
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")
desired_order <- c("y", "X", "z")

看起来是这样的:

代码语言:javascript
复制
                                                  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进行排序。

代码语言:javascript
复制
desired_order <- c("y", "X", "z")

然后对每个shortgo组按PosCount进行内部排序。产生这种情况:

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

我试过但失败了:

代码语言:javascript
复制
library(dplyr)
#tdf %>% arrange(as.character(shortgo), desc(PosCount))
tdf %>% arrange(desired_order, desc(PosCount))

正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 04:06:15

使用变量的factor表示来强制执行所需的order

dplyr中,只需:

代码语言:javascript
复制
tdf %>% arrange(factor(shortgo,levels=desired_order), desc(PosCount) )

在基数R中,只需使用:

代码语言:javascript
复制
tdf[order(factor(tdf$shortgo,levels=desired_order), -tdf$PosCount),]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30044020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档