web-dev-qa-db-ja.com

文字列を5文字ごとに分割する

長い文字列があるとします:

"XOVEWVJIEWNIGOIWENVOIWEWVWEW"

これを分割して5文字ごとにスペースを続けるにはどうすればよいですか?

"XOVEW VJIEW NIGOI WENVO IWEWV WEW"

最後の方が短いことに注意してください。

私は常に文字列をカウントして新しい文字列を構築するループを実行できますが、確かに何か良いことはないでしょうか?

28
user1357015

正規表現を使用する:

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

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"  
13
Jilber Urbina

次のようなものを試すことができます:

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=' ')スペースを含む単一の文字列を取得します。

9
musically_ut

*適用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関数はベクトル化されているため、ここで* applyを使用する必要はありません。

7
bartektartanus

ループのない部分文字列を使用することもできます。 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"
6
Rich Scriven