2014-10-21 19 views
17

Załóżmy, że mam długi ciąg:podzielić ciąg co 5 znaków

"XOVEWVJIEWNIGOIWENVOIWEWVWEW" 

Jak mogę podzielić to, aby co 5 znaków następnie przestrzeni?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW" 

Pamiętaj, że ten ostatni jest krótszy.

Potrafię zrobić pętlę, w której nieustannie liczyć i budować nowy ciąg znaków według znaków, ale na pewno musi być coś lepszego, nie?

+3

Sprawdź to pytanie: https://stackoverflow.com/questions/2247045/chopping-a-string-into-a-vector-of-fixed-width-character-elements – n8sty

Odpowiedz

37

Korzystanie z wyrażeń regularnych:

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

To całkiem cholernie dobre, muszę powiedzieć, –

+0

@flodel, czy możesz pomóc wyjaśnić "\\ 1"? Wymyśliłem wszystko inne ale to mnie potknęło – user1357015

+1

@ user1357015 Myślę, że hwnd wykonuje dobrą pracę wyjaśniając ten pomysł tutaj: http://stackoverflow.com/a/26495062/1000343 –

8

Można spróbować czegoś tak:

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

wyjściowa:

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

Teraz można paste Otrzymany wektor (z collapse=' '), aby otrzymać pojedynczy łańcuch ze spacjami.

+2

należy wkleić i zwinąć metinks – rawr

+0

wygląda świetnie, mogę tu wkleić i zwinąć. Ale czy mógłbyś dać wgląd w to, jak działa ta aplikacja? Dzięki! – user1357015

+0

@ user1357015 Dodano komentarze. –

11

Korzystanie 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

Można również użyć podnapis bez pętli. substring jest wektorowy 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

Nie * zastosowanie stringi rozwiązanie:

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

ten wydobywa podciągi podobnie jak w @Jilber odpowiedź, ale stri_sub funkcja jest wektorowy se nie musimy używać * Obowiązują tutaj.

Powiązane problemy