【问题标题】:Sort chromosome names using factor使用因子对染色体名称进行排序
【发布时间】:2019-12-16 23:16:57
【问题描述】:

我有两个数据框,每个都有两列 - 染色体名称和我想按时间顺序绘制的那个染色体的计数。但是,如果根本不计算某些染色体,我就会遇到问题。以下是我的数据的一个小样本:

df1$chrom
chr1 chr10 chr3 chr4 chr5
df1$count
1 2 1 4 5

df2$chrom
chr1 chr10 chr3 chr5
df2$count
1 4 3 1

为了按时间顺序排列,我使用因子

chrOrder <-c(paste0("chr",1:22),"chrX","chrY")
df1$chrom <- factor(df2_8$Chromosome, chrOrder, ordered=TRUE)
df1<- df1[do.call(order, df1[, c("chrom ", "count")]), ]

df1 给了我

df1$chrom
chr1 chr3 chr4 chr5 chr10
df1$count
1 1 4 5 2

它也适用于第二个数据帧。

但是为了有效地绘制它们,我需要第二个数据框包含一个 0 表示 4 号染色体,该数据未计入此数据。

df2$chrom
chr1 chr3 chr4 chr5 chr10
df2$count
1 3 0 1 4

我尝试使用因子添加 NA,然后将其替换为 0,使用 addNA,但它不起作用。有人可以帮我吗?谢谢你。

我的问题类似于sort by chromosome name,但我不确定如何解决问题的具体部分。

【问题讨论】:

    标签: r sorting na


    【解决方案1】:

    您可以使用tidyr::complete 来获取df1 中缺少的chrom

    df3 <- tidyr::complete(df2, chrom = factor(chrom, levels = levels(df1$chrom)), 
                    fill = list(count = 0))
    
    # chrom count
    #  <chr> <dbl>
    #1 chr1      1
    #2 chr10     4
    #3 chr3      3
    #4 chr4      0
    #5 chr5      1
    

    我们可以使用gtools::mixedorder对它们进行排序

    df3[gtools::mixedorder(df3$chrom), ]
    
    # chrom count
    #  <chr> <dbl>
    #1 chr1      1
    #2 chr3      3
    #3 chr4      0
    #4 chr5      1
    #5 chr10     4
    

    或者定制一些东西

    df3[order(as.integer(gsub("[^0-9]", "", df3$chrom))), ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多