首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为一列重新排序具有两个条件的变量

为一列重新排序具有两个条件的变量
EN

Stack Overflow用户
提问于 2022-04-29 13:35:46
回答 1查看 34关注 0票数 1

我想用不同的富集代谢途径的富集分数制作一个条形图(见表,variable = NES)。

这是我的数据

代码语言:javascript
运行
复制
structure(list(NAME = c("KEGG_BETA_ALANINE_METABOLISM", "KEGG_PEROXISOME", 
"KEGG_VALINE_LEUCINE_AND_ISOLEUCINE_DEGRADATION", "KEGG_DRUG_METABOLISM_OTHER_ENZYMES", 
"KEGG_ALANINE_ASPARTATE_AND_GLUTAMATE_METABOLISM", "KEGG_OXIDATIVE_PHOSPHORYLATION", 
"KEGG_AMINOACYL_TRNA_BIOSYNTHESIS", "KEGG_GLYOXYLATE_AND_DICARBOXYLATE_METABOLISM", 
"KEGG_GLYCINE_SERINE_AND_THREONINE_METABOLISM", "KEGG_FOCAL_ADHESION", 
"KEGG_ECM_RECEPTOR_INTERACTION", "KEGG_CELL_ADHESION_MOLECULES_CAMS", 
"KEGG_LEUKOCYTE_TRANSENDOTHELIAL_MIGRATION", "KEGG_HEMATOPOIETIC_CELL_LINEAGE", 
"KEGG_LEISHMANIA_INFECTION"), SIZE = c(22L, 77L, 39L, 25L, 27L, 
98L, 22L, 16L, 30L, 192L, 83L, 105L, 112L, 67L, 52L), ES = c(0.6333836, 
0.4741722, 0.54287475, 0.53727466, 0.52466995, 0.39599127, 0.5367668, 
0.57810646, 0.47952536, -0.63034177, -0.6984717, -0.65617377, 
-0.638508, -0.6932509, -0.69873965), NES = c(1.9397553, 1.8766444, 
1.8667365, 1.7000551, 1.6511785, 1.6349672, 1.6263499, 1.5636431, 
1.5489777, -2.6781485, -2.64518, -2.5497398, -2.4806988, -2.4616463, 
-2.4117668), NOM.p.val = c(0, 0, 0, 0.0093240095, 0.023148147, 
0.0024271845, 0.011520738, 0.046620045, 0.028697573, 0, 0, 0, 
0, 0, 0), FDR.q.val = c(0.018558597, 0.01772788, 0.013456956, 
0.059479948, 0.06941477, 0.066045, 0.060804494, 0.08560156, 0.0844615, 
0, 0, 0, 0, 0, 0), FWER.p.val = c(0.031, 0.058, 0.067, 0.341, 
0.454, 0.501, 0.53, 0.711, 0.753, 0, 0, 0, 0, 0, 0), RANK.AT.MAX = c(8546L, 
6704L, 6861L, 3072L, 6397L, 11642L, 10387L, 5387L, 6522L, 5367L, 
3928L, 5004L, 5034L, 3514L, 5809L)), row.names = c(NA, 15L), class = "data.frame")

我想给我的变量排序,以便:

  • 为正时,变量按降序
  • 排列,当NES为负值时,按

升序排列。

我的起始脚本是:

代码语言:javascript
运行
复制
df %>%
  filter(FDR.q.val < 0.05) %>%
  select(c(NAME, NES)) %>%
  mutate(sign=ifelse(NES>0, "CondA", "CondB")) %>%
  mutate(NAME=fct_reorder(NAME, NES)) %>%
  ggplot(aes(x=NAME,y=NES, fill=sign))+
  geom_bar(stat="identity")+
  coord_flip()+
  xlab("")+
  ylab("Normalized Enrichment Score")

我的想法是在fct_reorder命令中使用ifelse,如下所示:

代码语言:javascript
运行
复制
df %>%
  filter(FDR.q.val < 0.05) %>%
  select(c(NAME, NES)) %>%
  mutate(sign=ifelse(NES>0, "CondA", "CondB")) %>%
  mutate(NAME=fct_reorder(NAME, ifelse(NES>0, NES, abs(NES)))) %>%
  ggplot(aes(x=NAME,y=NES, fill=sign))+
  geom_bar(stat="identity")+
  coord_flip()+
  xlab("")+
  ylab("Normalized Enrichment Score")

但这不管用..。有人能帮我解决这个小问题吗?

非常感谢。

亚历克斯

EN

回答 1

Stack Overflow用户

发布于 2022-04-29 14:03:52

不知道你想不想要这个。如果是这样的话,您可以简单地为您的reorder变量使用sorting NES,而不需要在ggplot的上游设置因子。

代码语言:javascript
运行
复制
library(tidyverse)

df %>%
  filter(FDR.q.val < 0.05) %>%
  mutate(sign=ifelse(NES>0, "CondA", "CondB")) %>%
  ggplot(aes(reorder(NAME, sort(NES, decreasing = T)), NES, fill = sign)) +
  geom_bar(stat="identity")+
  coord_flip()+
  xlab("")+
  ylab("Normalized Enrichment Score")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72058836

复制
相关文章

相似问题

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