问题
I have a string in a variable which we call v1. This string states picture numbers and takes the form of "Pic 27 + 28". I want to extract the first number and store it in a new variable called item.
Some code that I've tried is:
item <- unique(na.omit(as.numeric(unlist(strsplit(unlist(v1),"[^0-9]+")))))
This worked fine, until I came upon a list that went:
[1,] "Pic 26 + 25"
[2,] "Pic 27 + 28"
[3,] "Pic 28 + 27"
[4,] "Pic 29 + 30"
[5,] "Pic 30 + 29"
[6,] "Pic 31 + 32"
At this point I get more numbers than I want, as it is also grabbing other unique numbers (the 25).
I've actually tried doing it with gsub, but got nothing to work. Help would be appreciated greatly!
回答1:
I assume that you'd like to extract the first of two numbers in each string.
You may use the stri_extract_first_regex
function from the stringi package:
library(stringi)
stri_extract_first_regex(c("Pic 26+25", "Pic 1,2,3", "no pics"), "[0-9]+")
## [1] "26" "1" NA
回答2:
In the responses below we use this test data:
# 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 This requires no packages but does involve a slightly longer regular expression:
as.numeric( sub("\\D*(\\d+).*", "\\1", v1) )
## [1] 26 27 28 29 30 31
3) read.table This involves no regular expressions or packages:
read.table(text = v1, fill = TRUE)[[2]]
## [1] 26 27 28 29 30 31
In this particular example the fill=TRUE
could be omitted but it might be needed if the components of v1
had a differing number of fields.
回答3:
You can do this very nicely with the str_first_number()
function from the strex
package, or for more general needs, you can use the str_nth_number()
function. Install it with 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
回答4:
To follow up your strsplit
attempt:
# 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
回答5:
With str_extract
from 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"
来源:https://stackoverflow.com/questions/23323321/r-extract-first-number-from-string