Как отсортировать векторные элементы в R на основе значений перед разделителем - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть вектор с именем myvec.Я хочу отсортировать значения на основе чисел до -.Любое предложение?

myvec <- c("2-1_16S_S217_R1_001.fastq", "2-2_16S_S226_R1_001.fastq", "3-1_16S_S234_R1_001.fastq", 
"3-2_16S_S242_R1_001.fastq", "11-1_16S_S199_R1_001.fastq", "1-1_16S_S197_R1_001.fastq", 
"11-2_16S_S209_R1_001.fastq", "1-2_16S_S207_R1_001.fastq")

Кроме того, когда я делаю sort (myvec), я получаю:

[1] "1-1_16S_S197_R1_001.fastq"  "1-2_16S_S207_R1_001.fastq"  "11-1_16S_S199_R1_001.fastq" "11-2_16S_S209_R1_001.fastq"
[5] "2-1_16S_S217_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq"  "3-1_16S_S234_R1_001.fastq"  "3-2_16S_S242_R1_001.fastq"

Также пытался

require('gtools')
mixedsort(myvec)

, который дает:

[1] "1-2_16S_S207_R1_001.fastq"  "1-1_16S_S197_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq"  "2-1_16S_S217_R1_001.fastq" 
[5] "3-2_16S_S242_R1_001.fastq"  "3-1_16S_S234_R1_001.fastq"  "11-2_16S_S209_R1_001.fastq" "11-1_16S_S199_R1_001.fastq"

результат, который я хочу:

1-1_16S_S197_R1_001.fastq
1-2_16S_S207_R1_001.fastq
2-1_16S_S217_R1_001.fastq
2-2_16S_S226_R1_001.fastq
3-1_16S_S234_R1_001.fastq
3-2_16S_S242_R1_001.fastq
11-1_16S_S199_R1_001.fastq
11-1_16S_S199_R1_001.fastq

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Один из вариантов - получить число с parse_number, order на нем

myvec[order(readr::parse_number(myvec))]
#[1] "1-1_16S_S197_R1_001.fastq"  "1-2_16S_S207_R1_001.fastq"  
#[3] "2-1_16S_S217_R1_001.fastq"  "2-2_16S_S226_R1_001.fastq" 
#[5] "3-1_16S_S234_R1_001.fastq"  "3-2_16S_S242_R1_001.fastq"
#[7] "11-1_16S_S199_R1_001.fastq" "11-2_16S_S209_R1_001.fastq"

Или мы хотим отсортировать по буквенно-цифровым символам перед первым -, а затем извлечьподстрока с str_extract (из stringr), используйте mixedorder (из gtools), чтобы упорядочить вектор

library(gtools)
library(stringr)
myvec[mixedorder(str_extract(myvec, "^[^-]+"))]
0 голосов
/ 12 февраля 2019

Мы также можем использовать str_sort из stringr:

stringr:::str_sort(myvec, numeric = TRUE)
# [1] "1-1_16S_S197_R1_001.fastq" 
# [2] "1-2_16S_S207_R1_001.fastq" 
# [3] "2-1_16S_S217_R1_001.fastq" 
# [4] "2-2_16S_S226_R1_001.fastq" 
# [5] "3-1_16S_S234_R1_001.fastq" 
# [6] "3-2_16S_S242_R1_001.fastq" 
# [7] "11-1_16S_S199_R1_001.fastq"
# [8] "11-2_16S_S209_R1_001.fastq"
0 голосов
/ 12 февраля 2019
> myvec[order(as.numeric(sub("(^\\d+).*", "\\1", myvec)))]

[1] "1-1_16S_S197_R1_001.fastq" 
[2] "1-2_16S_S207_R1_001.fastq" 
[3] "2-1_16S_S217_R1_001.fastq" 
[4] "2-2_16S_S226_R1_001.fastq" 
[5] "3-1_16S_S234_R1_001.fastq" 
[6] "3-2_16S_S242_R1_001.fastq" 
[7] "11-1_16S_S199_R1_001.fastq"
[8] "11-2_16S_S209_R1_001.fastq"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...