2012-03-31 11 views
3

Ich habe eine harte Zeit, Elemente zwischen einem / und einem black space zu extrahieren. Ich kann dies tun, wenn ich zwei Zeichen wie < und > zum Beispiel habe, aber der Platz wirft mich. Ich hätte gerne den effizientesten Weg, dies in Base R as zu tun. Dies wird auf Tausende von Vektoren angewendet werden.Elemente zwischen einem Zeichen und Leerzeichen extrahieren

Ich möchte dies drehen:

x <- "This/DT is/VBZ a/DT short/JJ sentence/NN consisting/VBG of/IN some/DT nouns,/JJ verbs,/NNS and/CC adjectives./VBG" 

dieses:

[1] "DT" "VBZ" "DT" "JJ" "NN" "VBG" "IN" "DT" "JJ" "NNS" "CC" "VBG" 

EDIT:

Vielen Dank für die Antworten. Ich gehe auf Geschwindigkeit, damit der Andres-Code gewinnt. Dwins Code gewinnt für die größte Menge an Code. Dirk war der Zweitschnellste. Die Stringr-Lösung war die langsamste (ich dachte, es wäre) und war nicht in der Basis, aber ist ziemlich verständlich (was wirklich die Absicht des stringr-Pakets ist, denke ich, da dies Hadleys Philosophie mit den meisten Dingen zu sein scheint.

Vielen Dank für Ihre Unterstützung Danke nochmal

ich dachte, ich würde das Benchmarking enthalten, da diese lapplied über mehrere tausend Vektoren werden:..

test replications elapsed relative user.self sys.self 
1 ANDRES  10000 1.06 1.000000  1.05  0 
3 DIRK  10000 1.29 1.216981  1.20  0 
2 DWIN  10000 1.56 1.471698  1.43  0 
4 FLODEL  10000 8.46 7.981132  7.70  0 

Antwort

5

ähnlich, aber etwas prägnanter:

#1- Separate the elements by the blank space 

    y=unlist(strsplit(x,' ')) 

#2- extract just what you want from each element: 

    sub('^.*/([^ ]+).*$','\\1',y) 

Wo Anfang und Ende Anker Zeichen sind ^ und $ jeweils .* jedes Zeichen Spiele . [^ ]+ nimmt die nicht leeren Zeichen. \\1 ist das erste markierte Zeichen

+0

ich, dass man mögen. Kompakt und erfordert nicht die Länge des Zwischenergebnisses zu betrachten. –

+0

Regex lässt mich Bier brauchen. –

2

Hier ist ein Einzeiler:

R> x <- paste("This/DT is/VBZ a/DT short/JJ sentence/NN consisting/VBG" 
       "of/IN some/DT nouns,/JJ verbs,/NNS and/CC adjectives./VBG" 
R> matrix(do.call(c, strsplit(gsub("[a-zA-Z.,]*/", " ", x), " ")), 
+   ncol=2, byrow=TRUE)[,2] 
[1] "DT" "VBZ" "DT" "JJ" "NN" "VBG" "IN" "DT" "JJ" "NNS" "CC" "VBG" 
R> 

Der Schlüssel ist der ‚Text vor Slash‘ loszuwerden:

R> gsub("[a-zA-Z.,]*/", " ", x) 
[1] " DT VBZ DT JJ NN VBG IN DT JJ NNS CC VBG" 
R> 

wonach es nur eine Frage ist

R> strsplit(gsub("[a-zA-Z.,]*/", " ", x), " ") 
[[1]] 
[1] "" "DT" "" "VBZ" "" "DT" "" "JJ" "" "NN" 
[11] "" "VBG" "" "IN" "" "DT" "" "JJ" "" "NNS" 
[21] "" "CC" "" "VBG" 

und Filtern des "" die Zeichenfolge zu spalten. Es kann durchaus kompaktere Wege für das letzte Bit geben. R>

3

Verwenden RegexMuster die FWD-slash oder Raum ist:

strsplit(x, "/|\\s") 
[[1]] 
[1] "This"  "DT"   "is"   "VBZ"   "a"   "DT"   "short"  
[8] "JJ"   "sentence" "NN"   "consisting" "VBG"   "of"   "IN"   
[15] "some"  "DT"   "nouns,"  "JJ"   "verbs,"  "NNS"   "and"   
[22] "CC"   "adjectives." "VBG" 

nicht die Q genau genug gelesen. Man könnte dieses Ergebnis verwenden, um die geradzahligen Elemente zu extrahieren:

strsplit(x, "/|\\s")[[1]][seq(2, 24, by=2)] 
[1] "DT" "VBZ" "DT" "JJ" "NN" "VBG" "IN" "DT" "JJ" "NNS" "CC" "VBG" 
1

Das stringr Paket hat nette Funktionen zum Arbeiten mit Strings, mit sehr intuitiven Namen.Hier können Sie str_extract_all verwenden, um alle Spiele zu bekommen (einschließlich der führenden Schrägstrich), dann str_sub die Schrägstriche zu entfernen:

str_extract_all(x, "/\\w*") 
# [[1]] 
# [1] "/DT" "/VBZ" "/DT" "/JJ" "/NN" "/VBG" "/IN" "/DT" "/JJ" "/NNS" 
# [11] "/CC" "/VBG" 

str_sub(str_extract_all(x, "/\\w*")[[1]], start = 2) 
# [1] "DT" "VBZ" "DT" "JJ" "NN" "VBG" "IN" "DT" "JJ" "NNS" "CC" "VBG" 
Verwandte Themen