2016-08-01 7 views
0

ich so etwas wie dieses:wie ein Zeichen in eine Zeichenfolge in R hinzuzufügen

text <- "abcdefg" 

und ich möchte etwas wie folgt aus:

"abcde.fg" 

wie könnte ich dies erreichen, ohne eine neue Zeichenfolge zuweisen auf den Vektor text, sondern stattdessen das Element des Vektors selbst ändern? Schließlich möchte ich zufällig den Punkt einfügen und eigentlich keinen Punkt, sondern das Zeichenelement eines Vektors.

+1

Um zu verdeutlichen: Sie können dies nicht tun. Sie müssen immer ein neues Objekt erstellen (dies gilt nicht für alle Sprachen, sondern für einige, insbesondere für R). –

+0

eine andere Option 'text <-" abcdefg "; Regmatches (Text, gregexpr ('(? <= ^. {5})', Text, Perl = TRUE)) <- '.'; text' – rawr

Antwort

2

Wir können mit sub versuchen, die ersten 5 Zeichen als Gruppe zu erfassen ((.{5})), gefolgt von einem oder mehreren Zeichen in einer anderen Capture-Gruppe ((.*)) und dann mit dem Rückreferenzierung der ersten Gruppe (\\1) durch ein . gefolgt ersetzen gefolgt von der zweiten Rückreferenz (\\2).

sub("(.{5})(.*)", "\\1.\\2", text) 
#[1] "abcde.fg" 

Hinweis: Diese Lösung ist direkt und braucht nicht zusammen zu paste nichts.

4

Auch substring mit paste funktioniert:

paste(substring(text, c(1,6), c(5,7)), collapse=".") 
"abcde.fg" 

Die substring Funktion akzeptiert Argumente Vektor-Start-Stopp und "Splits" die Zeichenfolge an den gewünschten Stellen. Wir können dann diese Elemente zusammen und mit dem Kollaps-Argument paste.

Ohne auf den Vektor Argumente zu stützen, könnten wir die neuere verwenden und empfohlene substr Funktion:

paste(c(substr(text, 1, 5), substr(text, 6,7)), collapse=".") 
[1] "abcde.fg" 

Beachten Sie, dass durch konrad-rudolph erwähnt, wie diese eine Kopie des Vektors zu schaffen.

+0

Die Art, wie ich die Dokumentation verstehe, 'substring' existiert nur für S-Kompatibilität, und vorwärts' substr' sollte stattdessen verwendet werden. Dies ist jedoch nicht klar. –

+0

Das ist mehr oder weniger meine Lektüre. Der einzige zusätzliche Vorteil von 'Teilzeichenfolge' besteht darin, dass 'Teilzeichenfolge' keine Vektor-Start- und Stopp-Argumente benötigt. – lmo

+0

Ja, und 'substr' erfordert ein' stop'-Argument (obwohl der Standardwert für 'susbtring' verrückt ist, sollte es ein sicherer Wert sein, der * nie * übergeben wird). Ich bin mir nicht sicher, warum 'substr 'überhaupt existiert, um ehrlich zu sein ...' substring 'scheint tatsächlich überlegen zu sein. –

Verwandte Themen