我正在尝试按升序对数据帧进行排序。然而,我希望我的行排序为"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+)(?:.*?$)
也许,但它是有效的。