2014-04-27 13 views
7

Ich habe eine Zeichenfolge in einer Variablen, die wir v1 nennen. Diese Zeichenfolge gibt Bildnummern an und nimmt die Form von "Pic 27 + 28" an. Ich möchte die erste Zahl extrahieren und in einer neuen Variablen namens item speichern.R extrahiere die erste Zahl aus der Zeichenfolge

Einige Code, die ich versucht habe, ist:

item <- unique(na.omit(as.numeric(unlist(strsplit(unlist(v1),"[^0-9]+"))))) 

Das funktionierte gut, bis ich auf eine Liste kam, die ging:

[1,] "Pic 26 + 25" 
[2,] "Pic 27 + 28" 
[3,] "Pic 28 + 27" 
[4,] "Pic 29 + 30" 
[5,] "Pic 30 + 29" 
[6,] "Pic 31 + 32" 

An dieser Stelle ich mehr Zahlen bekommen, als ich will , da es auch andere eindeutige Zahlen (die 25) ergreift.

Ich habe tatsächlich versucht, es mit gsub zu tun, aber nichts zu arbeiten. Hilfe wäre sehr willkommen!

+0

jemals mehr als 100 Bilder da sein. Zum Beispiel, wäre es jemals "Pic 105 + 104"? –

Antwort

9

Ich nehme an, dass Sie die erste von zwei Zahlen in jeder Zeichenfolge extrahieren möchten.

können Sie verwenden, um die stri_extract_first_regex Funktion aus dem stringi Paket:

library(stringi) 
stri_extract_first_regex(c("Pic 26+25", "Pic 1,2,3", "no pics"), "[0-9]+") 
## [1] "26" "1" NA 
+0

Das hat super funktioniert, danke! – kneijenhuijs

1

Um Ihre strsplit Versuch zu folgen:

# 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

In den Antworten unten wir diese Testdaten verwenden:

# 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) Unter Dies keine Pakete erfordert hat aber einen etwas längeren regulären Ausdruck beinhaltet:

as.numeric(sub("\\D*(\\d+).*", "\\1", v1)) 
## [1] 26 27 28 29 30 31 

3) read.table Dies beinhaltet keine regulären Ausdrücke oder Pakete:

read.table(text = v1, fill = TRUE)[[2]] 
## [1] 26 27 28 29 30 31 

In diesem speziellen Beispiel der fill=TRUE könnte weggelassen werden, aber es könnte erforderlich sein, wenn die Komponenten von v1 eine unterschiedliche Anzahl von Feldern hätten.

1

Sie können dies sehr schön mit der first_number() Funktion aus dem filesstrings Paket, oder für allgemeinere Bedürfnisse können Sie die nth_number() Funktion verwenden. Installieren Sie es über install.packages("filesstrings").

library(filesstrings) 
#> Loading required package: stringr 
strings <- c("Pic 26 + 25", "Pic 27 + 28", "Pic 28 + 27", 
      "Pic 29 + 30", "Pic 30 + 29", "Pic 31 + 32") 
first_number(strings) 
#> [1] 26 27 28 29 30 31 
nth_number(strings, n = 1) 
#> [1] 26 27 28 29 30 31 
1

Mit str_extract von 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"