>我在一个变量中有一个字符串,我们称之为v1。此字符串表示图片编号,并采用"Pic 27 + 28"的形式。我想提取第一个数字并将其存储在一个名为 item 的新变量中。
我尝试过的一些代码是:
item <- unique(na.omit(as.numeric(unlist(strsplit(unlist(v1),"[^0-9]+")))))
这工作得很好,直到我发现一个列表:
[1,] "Pic 26 + 25"
[2,] "Pic 27 + 28"
[3,] "Pic 28 + 27"
[4,] "Pic 29 + 30"
[5,] "Pic 30 + 29"
[6,] "Pic 31 + 32"
在这一点上,我得到的数字比我想要的要多,因为它也抓住了其他唯一数字(25(。
我实际上已经尝试过使用 gsub 来做,但没有任何效果。帮助将不胜感激!
我假设你想提取每个字符串中两个数字中的第一个。
您可以使用 stringi 包中的 stri_extract_first_regex
函数:
library(stringi)
stri_extract_first_regex(c("Pic 26+25", "Pic 1,2,3", "no pics"), "[0-9]+")
## [1] "26" "1" NA
在下面的响应中,我们使用此测试数据:
# test data
v1 <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27", "Pic 29 + 30",
"Pic 30 + 29", "Pic 31 + 32")
1( Gsubfn
library(gsubfn)
strapply(v1, "(\d+).*", as.numeric, simplify = c)
## [1] 26 27 28 29 30 31
2( sub 这不需要包,但确实涉及稍长的正则表达式:
as.numeric( sub("\D*(\d+).*", "\1", v1) )
## [1] 26 27 28 29 30 31
3( read.table 这不涉及正则表达式或包:
read.table(text = v1, fill = TRUE)[[2]]
## [1] 26 27 28 29 30 31
在此特定示例中,可以省略fill=TRUE
,但如果v1
的组件具有不同数量的字段,则可能需要它。
来自stringr
的str_extract
:
library(stringr)
vec = c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27",
"Pic 29 + 30", "Pic 30 + 29", "Pic 31 + 32")
str_extract(v1, "[0-9]+")
# [1] "26" "27" "28" "29" "30" "31"
strex
包中的str_first_number()
函数很好地做到这一点,或者对于更一般的需求,您可以使用str_nth_number()
函数。使用 install.packages("strex")
安装它。
library(strex)
#> Loading required package: stringr
strings <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27",
"Pic 29 + 30", "Pic 30 + 29", "Pic 31 + 32")
str_first_number(strings)
#> [1] 26 27 28 29 30 31
str_nth_number(strings, n = 1)
#> [1] 26 27 28 29 30 31
要跟进您的strsplit
尝试,请执行以下操作:
# split the strings
l <- strsplit(x = c("Pic 26 + 25", "Pic 27 + 28"), split = " ")
l
# [[1]]
# [1] "Pic" "26" "+" "25"
#
# [[2]]
# [1] "Pic" "27" "+" "28"
# extract relevant part from each list element and convert to numeric
as.numeric(lapply(l , `[`, 2))
# [1] 26 27