Упорядочить список объектов IRanges, чтобы получить все элементы по убыванию

У меня возникают трудности при попытке упорядочить список по убыванию...

У меня есть объект ByPos_Mindex или список из 1000 объектов IRange (CG_seqP) из

 C <- vmatchPattern(CG, CPGi_Seq, max.mismatch = 0, with.indels = FALSE)



IRanges object with 27 ranges and 0 metadata columns:
           start       end     width
       <integer> <integer> <integer>
   [1]         1         2         2
   [2]         3         4         2
   [3]         9        10         2
   [4]        27        28         2
   [5]        34        35         2
   ...       ...       ...       ...
  [23]       189       190         2
  [24]       207       208         2
  [25]       212       213         2
  [26]       215       216         2
  [27]       218       219         2

длина (1000 из этих IRanges)

Затем я изменяю это на список только начальных целых чисел (которые я хочу)

CG_SeqP <- sapply(C, function(x) sapply(as.vector(x), "[", 1)) 



[[1]]
 [1]   1   3   9  27  34  47  52  56  62  66  68  70  89 110 112
[16] 136 140 146 154 160 163 178 189 207 212 215 218

(1000 из них)

Проблема возникает, когда я пытаюсь упорядочить список элементов, используя

 CG_SeqP <- sapply(as.vector(CG_SeqP),order, decreasing = TRUE)

Я получаю список того, что я считаю номерами строк, поэтому, если первый объект IRAnge равен 27, я получаю это...

CG_SeqP[1]
[[1]]
 [1] 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8
[21]  7  6  5  4  3  2  1

Таким образом, уменьшение сработало, но не для моего фактического списка элементов>?

Любые предложения, заранее спасибо.

1 ответ

Решение

Порядок возвращает порядок последовательности, а не фактические элементы вашего вектора, чтобы извлечь его, давайте рассмотрим пример с игрушкой (я следую вашей идее здесь):

set.seed(1)
alist1 <- list(a = sample(1:100, 30))

Итак, если вы напечатаете alist1 с текущим начальным значением, вы получите следующие результаты:

> alist1
$a
 [1] 99 51 67 59 23 25 69 43 17 68 10 77 55 49 29 39 93 16 44
[20]  7 96 92 80 94 34 97 66 31  5 24

Теперь для сортировки их либо вы используете sort функция или вы можете использовать order, sort просто сортирует данные, тогда как order просто возвращает порядковый номер элементов в отсортированной последовательности. Он не возвращает фактическую последовательность, он возвращает позицию. Следовательно, нам нужно поместить эти позиции в фактический вектор, используя квадратные скобки, чтобы получить правильный отсортированный результат.

lapply(as.vector(alist1),function(x)x[order(x, decreasing = TRUE)])

я использовал lapply вместо sapply просто чтобы обеспечить результат в виде списка. Вы можете выбрать любую командную базу, которая вам нужна

Вернусь:

#> lapply(as.vector(alist1),function(x)x[order(x, decreasing = TRUE)])
#$a
# [1] 99 97 96 94 93 92 80 77 69 68 67 66 59 55 51 49 44 43 39
#[20] 34 31 29 25 24 23 17 16 10  7  5

Я надеюсь, что это проясняет ваши сомнения. Спасибо

Другие вопросы по тегам