Split a string every 5 characters
12,373
Solution 1
Using regular expressions:
gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
Solution 2
Using 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"
Solution 3
You can try something like the following:
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)))
Output:
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
Now you can paste
the resulting vector (with collapse=' '
) to obtain a single string with spaces.
Solution 4
No *apply stringi
solution:
x <- "XOVEWVJIEWNIGOIWENVOIWEWVWEW"
stri_sub(x, seq(1, stri_length(x),by=5), length=5)
[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
This extracts substrings just like in @Jilber answer, but stri_sub
function is vectorized se we don't need to use *apply here.
Solution 5
You can also use a sub-string without a loop. substring
is the vectorized 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"
Author by
user1357015
Updated on June 02, 2022Comments
-
user1357015 almost 2 years
Suppose I have a long string:
"XOVEWVJIEWNIGOIWENVOIWEWVWEW"
How do I split this to get every 5 characters followed by a space?
"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
Note that the last one is shorter.
I can do a loop where I constantly count and build a new string character by character but surely there must be something better no?
-
rawr over 9 yearsshould be pasted and collapsed methinks
-
user1357015 over 9 yearsThis looks great, I can paste and collapse from here. But would you mind giving some insight onto how that mapply works? Thanks!
-
musically_ut over 9 years@user1357015 Added some comments.
-
user1357015 over 9 years@flodel, can you help explain "\\1 "? I've figured everything else out but that stumbles me
-
Tyler Rinker over 9 years@user1357015 I think hwnd does a nice job explaining this idea here: stackoverflow.com/a/26495062/1000343
-
Brian D almost 6 yearsthis is awesome, and super fast :)
-
Lasarus9 almost 5 yearsWhat would be the way to reverse this? For example, how would you do this starting from the right, and going to left? Also, instead of splitting by 5, lets say i want the first 8 characters and the last 6 characters separated, so it would look like: ` "XOVEWVJI EWNIGOIWENVOIW EWVWEW" `