2016-12-21 3 views
4

I eine Matrix wie diese haben (jede Zeile ist ein String):R - entfernen Text nach dem zweiten Raum

m <- matrix(c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", 
       "Amaioua intermedia Mart.", 
       "Baccharis reticularia DC."),, 1) 

Ich mag den Text nach dem zweiten Raum entfernen und zurückgeben:

Agarista revoluta 
Amaioua intermedia 
Baccharis reticularia 

Ich versuchte einige Kombinationen mit gsub, aber ich war nicht erfolgreich.

Kann mir jemand dabei helfen?

+0

'Bibliothek (stringr); Wort (x, 1, 2) ' – Sotos

+1

@Sotos großartig! Ich denke, dass ich dieses Paket erforschen muss ... scheint ziemlich handlich zu sein! –

+0

@Sotos genial! –

Antwort

4

können Sie

x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.", "Baccharis reticularia DC.") 
sub("^(\\S*\\s+\\S+).*", "\\1", x) 
## => [1] "Agarista revoluta"  "Amaioua intermedia" "Baccharis reticularia" 

die regex demo und ein online R demo nachschauen.

Muster Details:

  • ^ - Beginn der Zeichenfolge
  • (\\S*\\s+\\S+) - Gruppe 1 Capturing 0+ Nicht-Leerzeichen Zeichen, dann 1+ Leerzeichen und dann 1+ Nicht-Whitespaces
  • .* - alle 0+ Zeichen, so viele wie möglich (bis zum Ende der Zeichenfolge).

Beachten Sie, dass die Saiten im Falle könnten führende Leerzeichen haben, und Sie wollen nicht, dass die Leerzeichen in zählen, sollten Sie

sub("^\\s*(\\S+\\s+\\S+).*", "\\1", x) 

verwenden Siehe another R demo

+0

Es funktioniert wie ein Zauber! –

1

spaltete die Zeichenfolge auf „“ und dann extrahieren die ersten 2 und fügen Sie sie zusammen

x <- c("Agarista revoluta (Spreng.) Hook. f. ex Nied.", "Amaioua intermedia Mart.", 
     "Baccharis reticularia DC.") 
sapply(x, function(y) paste(unlist(strsplit(y, " "))[1:2], collapse = " ")) 
2

Dies verwendet keine regulären Ausdrücke oder Pakete:

with(read.table(text = m, fill = TRUE), trimws(paste(V1, V2))) 

geben:

[1] "Agarista revoluta"  "Amaioua intermedia" "Baccharis reticularia" 

Wenn jeder Eingang mindestens zwei Wörtern hat, dann können Sie die trimws weglassen.

+0

Danke. Ich werde meine Frage bearbeiten. –

3

Eine weitere mögliche Regex, könnte einige nette Funktionen für diese Art von Operationen

sub('^(\\w+\\s+\\w+).*', '\\1', x) 
#[1] "Agarista revoluta"  "Amaioua intermedia" "Baccharis reticularia" 

Alternativ hat stringr Paket. Zum Beispiel

library(stringr) 
word(x, 1, 2) 
#[1] "Agarista revoluta"  "Amaioua intermedia" "Baccharis reticularia" 
Verwandte Themen