r - R:根据不同长度的向量对df行进行排序
问题描述
我想对 df 进行排序,以便行按向量的顺序显示。我在这里尝试过,但它返回的 df 行重新标记与向量中的行完全一样,而不是整个 df 简单地重新排序。
我的 df 就像:
> head(df)
POSITION MEANDEPTH CHROM
1 0:10000 0 chr1
2 10000:20000 0 chr1
3 20000:30000 0 chr1
4 30000:40000 0 chr1
5 40000:50000 0 chr1
6 50000:60000 0 chr1
> tail(df)
POSITION MEANDEPTH CHROM
308834 57170000:57180000 0 chrY
308835 57180000:57190000 0 chrY
308836 57190000:57200000 0 chrY
308837 57200000:57210000 0 chrY
308838 57210000:57220000 0 chrY
308839 57220000:57230000 0 chrY
> levels(df$CHROM)
[1] "chr1" "chr10" "chr11" "chr12" "chr13" "chr14" "chr15" "chr16" "chr17" "chr18" "chr19" "chr2" "chr20" "chr21" "chr22" "chr3" "chr4"
[18] "chr5" "chr6" "chr7" "chr8" "chr9" "chrM" "chrX" "chrY"
我想根据 df$CHROM 重新排序 df ,以便行按以下顺序排列:
# RE_ORDER CHROMS
chrom_order <- c('chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11',
'chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chrX','chrM')
我试过了:
df <- df[match(chrom_order, df$CHROM),]
但这些行被重新排序如下:
> head(df)
POSITION MEANDEPTH CHROM
1 0:10000 0 chr1
128716 0:10000 0 chr2
169134 0:10000 0 chr3
188964 0:10000 0 chr4
207986 0:10000 0 chr5
226140 0:10000 0 chr6
我正在尝试制作 df,以便 chr1 全部出现在一起,然后 chr2、chr3 等出现在向量“chrom_order”中。
我也试过:
library(dplyr)
df %>%
slice(match(CHROM, chrom_order))
但这也不起作用。我考虑过用不同的 df$CHROM 值对时间进行子集化,然后按照我想要的顺序重新加入 dfs,但这似乎有点冗长,效率低下。我确定有一个快速修复?
解决方案
只需设置级别的顺序:
df$CHROM = factor(df$CHROM, levels = chrom_order)
然后您可以在此列上订购您的数据框(级别的顺序现在是因素的一部分)
df[order(df$CHROM, df$POSITION), ]
旁注:不确定您是否手动输入了所需的订单。如果是这样,您将来可能希望执行以下操作:
chrom_order = c(paste0("chr", 1:22), "chrX", "chrM")
推荐阅读
- node.js - 如何在路由中传递模式模型
- solr - SOLR 同义词不适用于某些关键字
- angular - Google ChartWrapper 的 draw() 在异步中不起作用
- php - 如何在我的 php 代码中创建删除功能
- php - 如何在 PHP 中按时对数组进行排序?
- azure-data-factory - 从 Azure 表存储引入时如何替换 Kusto 群集行(Azure 数据资源管理器)
- php - 如何通过参数将值传递给另一个控制器
- recursion - 将嵌套对象合并到一层
- html - 如何在 Razor 中应用条件类
- javascript - 如何使用布尔标志跳过特定事件?