2014-10-21 36 views
17

Supponiamo che io ho una lunga serie:dividere una stringa ogni 5 caratteri

"XOVEWVJIEWNIGOIWENVOIWEWVWEW" 

Come faccio a dividere questo per ottenere ogni 5 caratteri seguito da uno spazio?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW" 

Si noti che l'ultimo è più breve.

Posso fare un ciclo in cui conto costantemente e costruisco una nuova stringa carattere per carattere ma sicuramente ci deve essere qualcosa di meglio no?

+3

controlla questa domanda: https://stackoverflow.com/questions/2247045/chopping-a-string-into-a-vector-of-fixed-width-character-elements – n8sty

risposta

37

Uso delle espressioni regolari:

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

Questo è dannatamente buono, devo dire –

+0

@flodel, puoi aiutarmi a spiegare "\\ 1"? Ho capito tutto il resto ma questo mi inciampa – user1357015

+1

@ user1357015 Penso che hwnd faccia un buon lavoro spiegando questa idea qui: http://stackoverflow.com/a/26495062/1000343 –

8

Si può provare qualcosa di simile a quanto segue:

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))) 

uscita:

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

Ora è possibile paste il vettore risultante (con collapse=' ') per ottenere una singola stringa con gli spazi.

+2

deve essere incollato e crollato methinks – rawr

+0

sembra fantastico, posso incollare e collassare da qui. Ma ti dispiacerebbe dare qualche idea su come funziona mapply? Grazie! – user1357015

+0

@ user1357015 Aggiunti alcuni commenti. –

11

Utilizzando 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

È anche possibile utilizzare un sub-stringa senza un ciclo. substring è la vettorizzati 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

No * applicare stringi soluzione:

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

Questo estrae stringhe come in @Jilber risposta, ma stri_sub funzione è vettorializzare se non abbiamo bisogno di usare * applicare Qui.

Problemi correlati