2014-10-21 125 views
17

假设我有一个长的字符串:分割字符串,每5个字符

"XOVEWVJIEWNIGOIWENVOIWEWVWEW" 

我如何拆分此得到后面有一个空格,每5个字符?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW" 

请注意,最后一个更短。

我可以做一个循环,我不断地计算和建立一个新的字符串的字符,但肯定还有一些更好的没有?

+3

检查出这个问题:https://stackoverflow.com/questions/2247045/chopping-a-string-into-a-vector-of-fixed-width-character-elements – n8sty 2014-10-21 22:48:20

回答

37

使用正则表达式:

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

这真是太好了,我必须说 – 2014-10-21 22:51:54

+0

@ flodel,你能帮忙解释“\\ 1”吗?我已经算出了所有其他的东西,但是绊倒我 – user1357015 2014-10-22 03:38:38

+1

@ user1357015我认为hwnd在这里解释这个想法做得很好:http://stackoverflow.com/a/26495062/1000343 – 2014-10-22 03:44:55

8

你可以尝试像下面的内容:

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

输出:

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

现在你可以paste结果矢量(与collapse=' '),以获得与空间的一个字符串。

+2

应粘贴和折叠methinks – rawr 2014-10-21 22:48:38

+0

这看起来不错,我可以从这里粘贴和折叠。但是,你介意给出一些有关这种基因工程如何工作的见解吗?谢谢! – user1357015 2014-10-21 22:50:11

+0

@ user1357015添加了一些评论。 – 2014-10-21 22:55:45

11

使用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

你也可以使用一个子串没有环。 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" 
4

否*适用stringi解决方案:

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

这提取子就像@Jilber的答案,但stri_sub功能被矢量本身我们并不需要使用*申请这里。