2014-10-21 10 views
17

Angenommen, ich habe eine lange Reihe:Split eine Zeichenfolge alle 5 Zeichen

"XOVEWVJIEWNIGOIWENVOIWEWVWEW" 

Wie teile ich dies alle 5 Zeichen, gefolgt von einem Leerzeichen zu erhalten?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW" 

Beachten Sie, dass der letzte kürzer ist.

Ich kann eine Schleife machen, in der ich ständig zähle und eine neue Zeichenkette für Zeichen erstelle, aber sicher muss es etwas besseres nicht geben?

+3

überprüfen Sie diese Frage: https://stackoverflow.com/questions/2247045/chopping-a-string-into-a-vector-of-fixed-width-character-elements – n8sty

Antwort

37

Verwenden von regulären Ausdrücken:

gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW") 
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW" 
+7

Das ist verdammt gut, ich muss sagen –

+0

@flodel, können Sie helfen erklären "\\ 1"? Ich habe alles andere herausgefunden aber das stolpert mich – user1357015

+1

@ user1357015 Ich denke, Hwnd macht einen netten Job, diese Idee hier zu erklären: http://Stackoverflow.com/a/26495062/1000343 –

8

Sie können so etwas wie das folgende versuchen:

s <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" # Original string 
l <- seq(from=5, to=nchar(s), by=5) # Calculate the location where to chop 

# Add sentinels 0 (beginning of string) and nchar(s) (end of string) 
# and take substrings. (Thanks to @flodel for the condense expression) 
mapply(substr, list(s), c(0, l) + 1, c(l, nchar(s))) 

Ausgang:

[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW" 

Jetzt können Sie das resultierende Vektor paste (mit collapse=' ') einen einzelnen String mit Leerzeichen zu erhalten.

+2

sollte eingefügt und kollabiert methinks – rawr

+0

This sieht gut aus, ich kann von hier aus einfügen und zusammenbrechen. Aber würde es Ihnen etwas ausmachen, einen Einblick zu geben, wie dieses Mapply funktioniert? Vielen Dank! – user1357015

+0

@ user1357015 Einige Kommentare hinzugefügt. –

11

Mit sapply

> string <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" 
> sapply(seq(from=1, to=nchar(string), by=5), function(i) substr(string, i, i+4)) 
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW" 
6

Sie können auch eine Unterkette ohne eine Schleife verwenden. substring ist die vektorisiert substr

x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" 
n <- seq(1, nc <- nchar(x), by = 5) 
paste(substring(x, n, c(n[-1]-1, nc)), collapse = " ") 
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW" 
4

Nein * anwenden stringi Lösung:

x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW" 
stri_sub(x, seq(1, stri_length(x),by=5), length=5) 
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW" 

Das extrahiert Teil wie in @Jilber Antwort, aber stri_sub Funktion vektorisiert se brauchen wir nicht * zu verwenden, gelten Hier.

Verwandte Themen