按列的升序对 Dataframe 中的行进行排序,但要根据数字的整数值

gudnpqoy  于 2023-04-03  发布在  其他
关注(0)|答案(3)|浏览(138)

我目前正在尝试按升序对我的 Dataframe 进行排序。然而,希望我的行被排序为例如“nv1,nv2,nv3,nv 15”而不是“nv1,nv14,nv15,nv2,nv3”。
有办法做到吗?
当使用arrange函数时,我的输出将是

nv1_SRRxxxx
nv100_SRRxxxx
nv12_SRRxxxx
nv13_SRRxxxx
nv144_SRRxxxx
nv151_SRRxxxx
nv16_SRRxxxx
nv173_SRRxxxx

但我希望得到

nv1_SRRxxxx
nv12_SRRxxxx
nv13_SRRxxxx
nv16_SRRxxxx
nv100_SRRxxxx
nv141_SRRxxxx
nv151_SRRxxxx
nv173_SRRxxxx

其中根据第一个“_”之前的数字值对行进行排序

uxh89sit

uxh89sit1#

使用正则表达式和order提取数字。

dat[order(with(dat, as.numeric(regmatches(V1, regexpr(r"{\d*(?=_)}", V1, perl=TRUE))))),,drop=FALSE]
#              V1
# 1   nv1_SRRxxxx
# 3  nv12_SRRxxxx
# 4  nv13_SRRxxxx
# 7  nv16_SRRxxxx
# 2 nv100_SRRxxxx
# 5 nv144_SRRxxxx
# 6 nv151_SRRxxxx
# 8 nv173_SRRxxxx

假设变量名为V1

  • 数据:*
dat <- structure(list(V1 = c("nv1_SRRxxxx", "nv100_SRRxxxx", "nv12_SRRxxxx", 
"nv13_SRRx12xx", "nv144_SRRxxxx", "nv151_SRR1xx", "nv16_SRRxxxx", 
"nv173_SRRxxxx")), class = "data.frame", row.names = c(NA, -8L
))
afdcj2ne

afdcj2ne2#

v <- c("nv1_SRRxxxx", "nv100_SRRxxxx", "nv12_SRRxxxx", "nv13_SRRxxxx", "nv144_SRRxxxx", "nv151_SRRxxxx", "nv16_SRRxxxx", "nv173_SRRxxxx")

v[sort(as.integer(gsub("nv(\\d+).+", "\\1", v, perl = T)), index.return = T)$ix]

[1] "nv1_SRRxxxx"   "nv12_SRRxxxx"  "nv13_SRRxxxx"  "nv16_SRRxxxx"  "nv100_SRRxxxx" "nv144_SRRxxxx" "nv151_SRRxxxx" "nv173_SRRxxxx"
am46iovg

am46iovg3#

:)
如果我没有理解错的话,您希望根据字符串中的数字按列排列数据集。
我要做的是从每个字符串中提取 first 数字,将其转换为数字,然后排列列。
在tidyverse中,你可以这样做:

library(dplyr)

dataframe <- tibble(colA = c("nv1_SRRxxxx",
                    "nv100_SRRxxxx",
                    "nv12_SRRxxxx",
                    "nv13_SRRxxxx",
                    "nv144_SRRxxxx",
                    "nv151_SRRxxxx",
                    "nv16_SRRxxxx",
                    "nv173_SRRxxxx"))

dataframe %>% 
    arrange(as.numeric(stringr::str_extract(colA, "^[^\\d].+?(\\d+)", group = 1)))

# or, if you want to use base R for the matching and extraction
dataframe %>% 
    arrange(as.numeric(gsub("^[^\\d].+?(\\d+)", "\\1", colA)))

这是一个很好的例子,当它是有益的学习一些regEx ...我不是很擅长。
表达式^[^\\d].+?(\\d+)表示要捕获它遇到的第一个数字,尽可能少地匹配它。可能有比这更好的正则表达式,(?:^[^\\d].+?)(\\d+)(?:.*?$),但它可以工作。

相关问题