R从字符串中提取第一个数字

Posted

技术标签:

【中文标题】R从字符串中提取第一个数字【英文标题】:R extract first number from string 【发布时间】:2014-06-12 22:49:05 【问题描述】:

我在一个变量中有一个字符串,我们称之为 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 来做这件事,但没有任何工作。非常感谢您的帮助!

【问题讨论】:

会有 100 多张照片吗?例如,它会不会是“Pic 105 + 104”? 【参考方案1】:

我假设您想提取每个字符串中两个数字中的第一个。

您可以使用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  

【讨论】:

【参考方案2】:

跟进您的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

【讨论】:

【参考方案3】:

在下面的回复中,我们使用了这个测试数据:

# 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 的组件具有不同数量的字段,则可能需要它。

【讨论】:

【参考方案4】:

您可以使用 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

【讨论】:

【参考方案5】:

str_extract 来自stringr

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"

【讨论】:

以上是关于R从字符串中提取第一个数字的主要内容,如果未能解决你的问题,请参考以下文章

从R中的字符向量中提取数字和下一个字符串

如何从R中数字之前的字符串中提取大写字母

R语言中如何提取字符串

从字符串中提取数字作为R中的数字或日期

如何从字符串中仅提取版本号

如何从字符串中提取数字?