【发布时间】:2014-12-17 07:41:21
【问题描述】:
假设我有一个长字符串:
"XOVEWVJIEWNIGOIWENVOIWEWVWEW"
如何拆分它以获得每 5 个字符后跟一个空格?
"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
请注意,最后一个较短。
我可以做一个循环,我不断地计算并逐个字符地构建一个新的字符串,但肯定有更好的东西不是吗?
【问题讨论】:
标签: r string split string-split
假设我有一个长字符串:
"XOVEWVJIEWNIGOIWENVOIWEWVWEW"
如何拆分它以获得每 5 个字符后跟一个空格?
"XOVEW VJIEW NIGOI WENVO IWEWV WEW"
请注意,最后一个较短。
我可以做一个循环,我不断地计算并逐个字符地构建一个新的字符串,但肯定有更好的东西不是吗?
【问题讨论】:
标签: r string split string-split
您可以尝试以下方法:
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=' ')来获得带有空格的单个字符串。
【讨论】:
使用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"
【讨论】:
使用正则表达式:
gsub("(.{5})", "\\1 ", "XOVEWVJIEWNIGOIWENVOIWEWVWEW")
# [1] "XOVEW VJIEW NIGOI WENVO IWEWV WEW"
【讨论】:
您也可以使用不带循环的子字符串。 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"
【讨论】:
否 *apply 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。
【讨论】: