R: сортировка строк в соответствии с вектором различной длины - PullRequest
0 голосов
/ 24 апреля 2018

Я бы хотел отсортировать 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 в соответствии с df $ CHROM, чтобы строки были в следующем порядке:

# 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 в том порядке, в котором я хочу, но это кажется немного длинным, неэффективным.Я уверен, что есть быстрое решение?

1 Ответ

0 голосов
/ 24 апреля 2018

Просто установите порядок уровней:

df$CHROM = factor(df$CHROM, levels = chrom_order)

Тогда вы можете заказать свой фрейм данных в этом столбце (порядок уровней теперь является частью коэффициента)

df[order(df$CHROM, df$POSITION), ]

Примечание: не уверены, что вы вручную набрали нужный вам порядок. Если это так, вы можете сделать что-то подобное в будущем:

chrom_order = c(paste0("chr", 1:22), "chrX", "chrM")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...