2016-10-13 8 views
2

Ich möchte den Blutdruck von der Schnur extrahieren. Die Daten könnten wie folgt aussehen:Extrahieren Muster "Nummer/Nummer"

text <- c("at 10.00 seated 132/69", "99/49", "176/109", 
"10.12 I 128/51, II 149/51 h.9.16", "153/82 p.90 ja 154/81 p.86", 
"h:17.45", "not measured", "time 7.30 RR 202/97 p. 69") 

Ich möchte Muster „Nummer/Nummer“ extrahieren (das heißt "132/69"). Im obigen Beispiel würde die erwartete Ausgabe eine Liste sein:

[[1]] 
[1] "132/69" 

[[2]] 
[1] "99/49" 

[[3]] 
[1] "176/109" 

[[4]] 
[1] "128/51" "149/51" 

[[5]] 
[1] "153/82" "154/81" 

[[6]] 
[1] "" 

[[7]] 
[1] "" 

[[8]] 
[1] "202/97" 

Die nächste Lösung, die ich habe:

gsub("^.*([0-9]{3}/[0-9]+).*","\\1", text) 

Leider ist in meiner Lösung nicht alle angepassten Fälle dieses Musters zurückkehrt und auch gibt eine Zeichenfolge zurück, die überhaupt kein Muster benötigt.

+1

Wird 'library (stringr)', 'str_extract_all (text," \\ d +/\\ d + ")' tun? –

Antwort

3
regmatches(text, gregexpr("\\d+/\\d+", text)) 
#[[1]] 
#[1] "132/69" 
# 
#[[2]] 
#[1] "99/49" 
# 
#[[3]] 
#[1] "176/109" 
# 
#[[4]] 
#[1] "128/51" "149/51" 
# 
#[[5]] 
#[1] "153/82" "154/81" 
# 
#[[6]] 
#character(0) 
# 
#[[7]] 
#character(0) 
# 
#[[8]] 
#[1] "202/97" 
1

Wenn Sie die genaue Ausgabe, die Sie beschrieben erhalten möchten, können Sie

verwenden
library(stringr) 
library(magrittr) 
text <- c("at 10.00 seated 132/69", "99/49", "176/109", 
      "10.12 I 128/51, II 149/51 h.9.16", "153/82 p.90 ja 154/81 p.86", 
      "h:17.45", "not measured", "time 7.30 RR 202/97 p. 69") 

str_extract_all(text, "\\d{2,3}/\\d{1,3}") %>% 
    lapply(FUN = function(x) if (length(x) == 0) "" else x) 

[[1]] 
[1] "132/69" 

[[2]] 
[1] "99/49" 

[[3]] 
[1] "176/109" 

[[4]] 
[1] "128/51" "149/51" 

[[5]] 
[1] "153/82" "154/81" 

[[6]] 
[1] "" 

[[7]] 
[1] "" 

[[8]] 
[1] "202/97" 

Sie auch regmatches Rolands verwenden könnte, wenn Sie in der Basis R. bleiben wollen

1

eine leichte & kompaktere Tangente an @ Benjamins Lösung, die einen schönen, einfachen Zeichenvektor zurückgibt und die Notwendigkeit vermeidet, mit Elementen der Länge 0 in der Roland-Liste umzugehen:

library(stringi) 
library(purrr) 

txt <- c("at 10.00 seated 132/69", "99/49", "176/109", 
     "10.12 I 128/51, II 149/51 h.9.16", "153/82 p.90 ja 154/81 p.86", 
     "h:17.45", "not measured", "time 7.30 RR 202/97 p. 69") 

stri_match_all_regex(txt, "\\d{2,3}/\\d{1,3}") %>% 
    flatten_chr() %>% 
    discard(is.na) 
## [1] "132/69" "99/49" "176/109" "128/51" "149/51" "153/82" "154/81" "202/97" 
Verwandte Themen