按列升序排序数据框中的行,但按数字的整数值排序

  • 本文关键字:排序 整数 数字 升序 数据 r
  • 更新时间 :
  • 英文 :


我正在尝试按升序对数据帧进行排序。然而,我希望我的行排序为"nv1, nv2, nv3, nv15 "而不是"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

,其中根据第一个"_">

之前的数字的值对行进行排序。

使用正则表达式和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
))
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"

:)

如果我理解正确的话,您是想按照字符串中的数字按列排列数据集。

我要做的是从每个字符串中提取第一个数字,将其转换为数字,然后排列列。

在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)))

这是一个很好的例子,当它是有益的学习一些正则表达式…我不太擅长。

表达式^[^\d].+?(\d+)表示捕获它遇到的第一个数字,尽可能少地匹配它。可能有比这更好的正则表达式,(?:^[^\d].+?)(\d+)(?:.*?$)也许,但它是有效的。

最新更新