首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据定界符前的值对R中的向量元素排序

如何根据定界符前的值对R中的向量元素排序
EN

Stack Overflow用户
提问于 2019-02-12 17:26:29
回答 3查看 43关注 0票数 2

我有一个叫做myvec的载体。我想根据-之前的数字对值进行排序。有什么建议吗?

代码语言:javascript
复制
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)时,我得到:

代码语言:javascript
复制
[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"

也试过

代码语言:javascript
复制
require('gtools')
mixedsort(myvec)

这意味着:

代码语言:javascript
复制
[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"

我想要的结果:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-12 17:37:10

一种选择是获取带有parse_numberorder的数字。

代码语言:javascript
复制
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)对向量进行排序。

代码语言:javascript
复制
library(gtools)
library(stringr)
myvec[mixedorder(str_extract(myvec, "^[^-]+"))]
票数 1
EN

Stack Overflow用户

发布于 2019-02-12 17:38:50

我们也可以使用来自str_sortstringr

代码语言:javascript
复制
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"
票数 2
EN

Stack Overflow用户

发布于 2019-02-12 17:37:01

代码语言:javascript
复制
> 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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54655570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档