r语言 - 一个更好的方法来子集列表?



我有一个字符串,我想从中得到数值

> head(temp.list)
[1] "A01:    24095" "A02:    31130" "A03:    39420" "A04:    41690" "A05:    37430" "A06:    36490"

我可以使用strsplit来获取一个列表

>split.temp.list <- strsplit(temp.list, ":")
>head(split.temp.list)
[[1]]
[1] "A01"       "    24095"
[[2]]
[1] "A02"       "    31130"

然后,为了将这些数字提取成一个向量,我执行

data.values <- vector()
for (j in 1:length(split.temp.list))
data.values <- c(data.values, split.temp.list[[j]][2])
> head(data.values)
[1] "    24095" "    31130" "    39420" "    41690" "    37430" "    36490"

是否有一种更有效的方法来实现最后一步(即。(创建data.values)?

离开多年后,我要回到R,所以谢谢你帮助我回到速度!

您可以使用sub,即

lapply(l1, function(i)trimws(sub('.*:', '', i)))
#[[1]]
#[1] "24095" "31130" "39420" "41690" "37430" "36490"

使用sapplyunlist()作为lapply的输出,使其达到您想要的输出结构

我们可以使用read.table来提取:之后的数字

> s <- c("A01:    24095", "A02:    31130", "A03:    39420", "A04:    41690", "A05:    37430", "A06:    36490")
> read.table(text = s, sep = ":")$V2
[1] 24095 31130 39420 41690 37430 36490

trimws

> as.numeric(trimws(s, whitespace = "^.*\s"))
[1] 24095 31130 39420 41690 37430 36490

我会使用sub:

sub(".*: *", "", s)
#[1] "24095" "31130" "39420" "41690" "37430" "36490"

,其中.*:删除所有内容,直到最后一个:*以下空格(可选为\s*)。
regexprregmatches:

regmatches(s, regexpr("\d+$", s))
#[1] "24095" "31130" "39420" "41690" "37430" "36490"

其中\d+匹配数字,$表示字符串的结束。


数据:
s <- c("A01:    24095", "A02:    31130", "A03:    39420", "A04:    41690", "A05:    37430", "A06:    36490")

基准

bench::mark(check = FALSE
, "sub" = sub(".*: +", "", s)
, "regexpr" = regmatches(s, regexpr("\d+$", s))
, "str_extract" = stringr::str_extract_all(s, "(?<= )[0-9]+")
, "trimws" = trimws(s, whitespace = "^.*\s")
, "sub+trimws" = trimws(sub('.*:', '', s))
, "strsplit" = strsplit(s, ":") |> lapply((x) x[2]) |> trimws()
, "read.table" = read.table(text = s, sep = ":")$V2
)
#  expression       min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc
#  <bch:expr>  <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>
#1 sub           5.17µs   6.63µs   145207.        0B     0    10000     0
#2 regexpr       9.72µs  11.72µs    76976.        0B    23.1   9997     3
#3 str_extract  11.71µs   12.4µs    75587.        0B     7.56  9999     1
#4 trimws       19.18µs   20.5µs    44033.        0B    13.2   9997     3
#5 sub+trimws   24.45µs  26.69µs    33972.        0B    13.6   9996     4
#6 strsplit     29.49µs  31.87µs    27962.    4.13KB    14.0   9995     5
#7 read.table  172.32µs 188.24µs     4274.   55.26KB    14.6   2048     7

在这种情况下,sub是最快的,但是方法返回的结果不一样。

可以先用strsplit再用lapply

text <- c("A01:    24095" , "A02:    31130" ,"A03:    39420" , "A04:    41690", "A05:    37430", "A06:    36490")
strsplit(text , ":") |> lapply((x) x[2]) |> trimws()
输出
[1] "24095" "31130" "39420" "41690" "37430" "36490"

一个简单的方法是使用str_extract_all来获取前面有空格的数字:

library(stringr)
str_extract_all(text, "(?<= )[0-9]+")
[[1]]
[1] "24095"
[[2]]
[1] "31130"
[[3]]
[1] "39420"
[[4]]
[1] "41690"
[[5]]
[1] "37430"
[[6]]
[1] "36490

相关内容

  • 没有找到相关文章

最新更新