我有一个字符串,我想从中得到数值
> 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"
使用sapply
或unlist()
作为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*
)。
或regexpr
与regmatches
:
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