将子字符串中的字符分配给facet_grid贴标签器的原始字符串

时间:2015-11-19 03:47:09

标签: r ggplot2 labels facet

我提前道歉,因为这里缺乏适当的术语,在我的标题中最为明显。我是自学成才,我的rudimentry R技能源于需要实施其他人的生物学研究代码。请在适用的地方更正。

因此,设置一个工作示例使用钻石:

library(ggplot2)
data(diamonds)

diamonds <- diamonds[sample(nrow(diamonds), 1000), ]
diamonds$cut <- factor(diamonds$cut,levels = c("Ideal", "Very Good", "Fair", "Good", "Premium"))

p <- ggplot(diamonds, aes(carat, ..density..)) +
    geom_histogram(binwidth = 1)
p + facet_grid(. ~ cut)

基本上当我使用自己的数据时,网格的每个方面的名称都太长了,所以我想在不改变数据的情况下归一个较短的名称。

我找到一篇帖子说我可以重新分配这样的名字:

LAB_NAMES<-list('Ideal'="I", 'Very Good' = "V",
               'Fair'="F",'Good' = "G",
               'Premium'="P")
NEW_LABELLER<-function(variable,value){return(LAB_NAMES[value])}

然后将贴标机添加到facet_grid

p <- ggplot(diamonds, aes(carat, ..density..)) +
    geom_histogram(binwidth = 1)
p + facet_grid(. ~ cut,labeller=NEW_LABELLER)

这对于一次性很好,但我正在生成一个新的名单(例如&#34; hsa-miR-4640-5p_hsa-mir-4640&#34;&#34; hsa-miR-548ap- 5p_hsa-MIR-548ap&#34; ...等) 每次我在实验中看一个新的情况。您可以看到名称很长,但包含一个共同的&#34; _&#34;在中间。因此,我可以使用sub来获取我想要的名称的一部分,例如,使用钻石,我们会做类似的事情:

NAMES<-c("Ideal", "Very Good", "Fair", "Good", "Premium")
SHORT_NAMES<-substr(NAMES, 1, 1)

但是手动将这些(相对较短的)名称放回到贴标机的列表中,既缓慢又乏味。

问题:是否有一种优雅的方法可以将短标签的子字符串分配给旧的长标签字符串,这些标签一下子概括了我将它们归结为下面的方式?

LAB_NAMES<-list('Ideal'="I", 'Very Good' = "V",
               'Fair'="F",'Good' = "G",
               'Premium'="P")

提前谢谢大家。并再次感谢SO的常规和耐心的贡献者。如果我能完成这个血腥的博士学位,我应该感谢你。

UPDATE - 我在对象sig_miRs中生成的长名称的一个例子:

>sig_miRs()
[1] "hsa-miR-10b-5p_hsa-mir-10b", "hsa-miR-143-3p_hsa-mir-143",
                   "hsa-miR-146b-5p_hsa-mir-146b","hsa-miR-150-5p_hsa-mir-150",
                   "hsa-miR-196a-3p_hsa-mir-196a-2","hsa-miR-199a-3p_hsa-mir-199a-2",
                   "hsa-miR-199b-3p_hsa-mir-199b","hsa-miR-23c_hsa-mir-23c",
                   "hsa-miR-4326_hsa-mir-4326","hsa-miR-4485-3p_hsa-mir-4485",
                   "hsa-miR-668-3p_hsa-mir-668","hsa-miR-6840-5p_hsa-mir-6840"

我的问题的解决方案应该采用上面的列表并优雅地概括一下:

sig_miRs_short<-list('hsa-miR-10b-5p_hsa-mir-10b'="hsa-miR-10b-5p", 'hsa-miR-143-3p_hsa-mir-143' = "hsa-miR-143-3p",
                   'hsa-miR-146b-5p_hsa-mir-146b'="hsa-miR-146b-5p",'hsa-miR-150-5p_hsa-mir-150' = "hsa-miR-150-5p",
                   'hsa-miR-196a-3p_hsa-mir-196a-2'="hsa-miR-196a-3p",'hsa-miR-199a-3p_hsa-mir-199a-2'="hsa-miR-199a-3p",
                   'hsa-miR-199b-3p_hsa-mir-199b'="hsa-miR-199b-3p",'hsa-miR-23c_hsa-mir-23c'="hsa-miR-23c",
                   'hsa-miR-4326_hsa-mir-4326'="hsa-miR-4326",'hsa-miR-4485-3p_hsa-mir-4485'="hsa-miR-4485-3p",
                   'hsa-miR-668-3p_hsa-mir-668'="hsa-miR-668-3p",'hsa-miR-6840-5p_hsa-mir-6840'="hsa-miR-6840-5p")
    sig_miR_labeller<-function(variable,value){return(sig_miRs_short[value])}

1 个答案:

答案 0 :(得分:1)

由于您只对长名称中下划线之前的部分感兴趣,因此可以通过多种方式访问​​它。

选项1:使用正则表达式。这个贴标签器用下划线(和下划线)替换字符串的每个部分,并带有一个空字符串。

sig_miR_labeller2 <- function(variable, value){
  return(gsub("_.+","",value))
}

编辑:这里是如何使用贴标机(和另一个选项)

#making some testdata, sampling from the long names
set.seed(123)
nobs=500

sig_miRs_short<-list('hsa-miR-10b-5p_hsa-mir-10b'="hsa-miR-10b-5p", 'hsa-miR-143-3p_hsa-mir-143' = "hsa-miR-143-3p",
                     'hsa-miR-146b-5p_hsa-mir-146b'="hsa-miR-146b-5p",'hsa-miR-150-5p_hsa-mir-150' = "hsa-miR-150-5p",
                     'hsa-miR-196a-3p_hsa-mir-196a-2'="hsa-miR-196a-3p",'hsa-miR-199a-3p_hsa-mir-199a-2'="hsa-miR-199a-3p",
                     'hsa-miR-199b-3p_hsa-mir-199b'="hsa-miR-199b-3p",'hsa-miR-23c_hsa-mir-23c'="hsa-miR-23c",
                     'hsa-miR-4326_hsa-mir-4326'="hsa-miR-4326",'hsa-miR-4485-3p_hsa-mir-4485'="hsa-miR-4485-3p",
                     'hsa-miR-668-3p_hsa-mir-668'="hsa-miR-668-3p",'hsa-miR-6840-5p_hsa-mir-6840'="hsa-miR-6840-5p")

testnames <- names(sig_miRs_short)
testdata <- data.frame(x=runif(nobs),y=runif(nobs),miR=sample(testnames,nobs,T))

方法1:使用贴标机功能。它需要你的长串 并删除下划线及其后的所有内容。

sig_miR_labeller <- function(variable, value){
  return(gsub("_.+","",value))
}

p1 <- ggplot(testdata, aes(x=x,y=y))+
  geom_point() +
  facet_grid(.~miR, labeller=sig_miR_labeller)

方法2:不要使用贴标机,而是在数据中创建'prettyvar' 使用它进行分面(如果你想使用facet_wrap,可能是实用的,因为它不需要贴标签参数)     testdata $ pretty_miR&lt; - gsub(“_。+”,“”,testdata $ miR)

p2 <- ggplot(testdata, aes(x=x,y=y))+
  geom_point()+
  facet_grid(.~pretty_miR)

两者都导致: enter image description here