每5个字符拆分一个字符串

use*_*015 26 string split r string-split

假设我有一个长字符串:

"XOVEWVJIEWNIGOIWENVOIWEWVWEW"
Run Code Online (Sandbox Code Playgroud)

如何拆分这个以获得每5个字符后跟一个空格?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
Run Code Online (Sandbox Code Playgroud)

请注意,最后一个更短.

我可以做一个循环,我不断计算并按字符构建一个新的字符串字符,但肯定必须有更好的东西吗?

flo*_*del 55

使用正则表达式:

gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
Run Code Online (Sandbox Code Playgroud)


Jil*_*ina 13

运用 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"  
Run Code Online (Sandbox Code Playgroud)


mus*_*_ut 9

您可以尝试以下内容:

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))) 
Run Code Online (Sandbox Code Playgroud)

输出:

[1] "XOVEW" "VJIEW" "NIGOI" "WENVO" "IWEWV" "WEW"
Run Code Online (Sandbox Code Playgroud)

现在,您可以paste使用结果向量(with collapse=' ')获取带空格的单个字符串.

  • 应该粘贴和崩溃的方法 (2认同)

bar*_*nus 7

否*申请stringi解决方案:

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

这就像@Jilber答案一样提取子串,但是stri_sub函数是矢量化的,我们不需要使用*apply here.


Ric*_*ven 6

您也可以使用没有循环的子字符串. substring是矢量化的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"
Run Code Online (Sandbox Code Playgroud)