关于r:如何在第n个元素中使用不同的分隔符连接字符串

How to concatenate strings with different separator every n-th element

我想每10个元素用不同的分隔符连接单词(字符串),这样每个单词都用逗号分隔,直到每10个单词再用逗号和换行符分隔。最终目的是将单词列表整齐地打印到表格中。

我可以编写一个循环,但是我希望使用gsub和正则表达式在这些相关问题中提出一个更优雅的解决方案:
在这里和这里涉及到在每个第n个字符之后插入/替换字符串,但是在我的情况下,我的单词(字符)的长度是可变的。

编辑:我正在寻找解决方案,我可以将其应用于单词数量可变的任何向量。

对于可重现的数据,我使用此来源的代码生成了一个40个随机单词的向量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MHmakeRandomString <- function(n, length) {
  randomString <- c(1:n)
  for (i in 1:n) {
    randomString[i] <- paste(sample(c(0:9, letters, LETTERS), length, replace=TRUE),
                             collapse="")}
  return(randomString)
}
set.seed(4)
word_vector <- MHmakeRandomString(n=40, length=5)
word_vector
# [1]"A0ihO""gIUW4""Kh6Xp""sYAXL""IZvuE""PtQvw""zeSEt""YsCo0""WfzbU""5TTIz"
# [11]"oKTOO""qaaTK""y4QUd""C4vNY""lDplP""Gjrg8""UHzUT""32ZcV""c7xgl""5Lr2H"
# [21]"fDgxt""zFdYO""hohuK""vrNU4""8oRg5""IYcyl""pblbO""SHhq0""yFjWa""rzYLr"
# [31]"m2AXf""QdhtM""TWpkh""4499K""5Bcv8""0DeqI""6BdTy""fJgKX""tUZeh""HPso5"

我通常会执行paste(x, collapse),然后使用gridExtra

打印到表格

1
2
3
4
5
6
7
8
word_sep <- paste(word_vector, collapse=",")
# [1]"z6LHb, 1ubB1, o9TZ2, 8s8bV, sZmcB, blirI, gMfo1, xXkkt, gFMrA, hXdaO,
# lNP2Q, p9B9G, JXTsJ, qVsWS, ntiT8, d0QRv, uoR1D, L99Bg, THWQo, meuev,
# IO0Au, 0yWmh, 72d3g, FJRDS, PtbJT, JaXVK, OPo9m, i0678, 6BpXZ, b6hzT,
# BDQBk, ANC5h, 7QPgM, JJSxf, nnX7Z, rbEfm, XXl4Z, kHMuI, wFLyM, P8rlp"

library(gridExtra)
plot_grid(tableGrob(word_sep))

当前表输出:在这种情况下,我的单词列表和指定的表宽度非常长,因此需要换行。
Current

我想要的输出看起来像这个被黑的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
word_sep2 <- paste(c(paste(MHmakeRandomString(n=10, length=5), collapse=","),",\
",
               paste(MHmakeRandomString(n=10, length=5), collapse=","),",\
",
               paste(MHmakeRandomString(n=10, length=5), collapse=","),",\
",
               paste(MHmakeRandomString(n=10, length=5), collapse=",")), collapse="")
word_sep2
# [1]"0ahiL, 2pA5c, dKWuR, 79sw5, MeL1I, KpB1w, UNLSo, LlDlN, jNOcI, tv8R5,
# \
orf60, avKFo, jZFxE, U7RQW, SSmxD, czlMt, 75zEB, 2jLwG, 08dmN, H3sVW,
# \
CZwQt, ggumo, wHUpj, Z7WGR, BHYLE, eWksX, Lbt3D, P1Brf, OpEvk, 1WFVa,
# \
EeFd4, afX7B, nyBzF, vbNLz, U7MU0, H4rx4, AKgv8, Kbzri, KKajp, Yg6EW"

plot_grid(tableGrob(word_sep2))

所需的表输出:
Desired


您可以使用

1
2
gsub("((?:[^,]*,){10})","\\\\1\
", word_sep)

请参阅在线正则表达式演示。

详细信息

  • ((?:[^,]*,){10})-组1(在替换模式中称为\\1),与10个连续出现的匹配

    • [^,]*-,以外的任何0个字符
    • ,-逗号
  • -一个空格

请参阅R演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MHmakeRandomString <- function(n, length) {
   randomString <- c(1:n)
   for (i in 1:n) {
     randomString[i] <- paste(sample(c(0:9, letters, LETTERS), length, replace=TRUE),
                              collapse="")}
   return(randomString)
}
set.seed(4)
word_vector <- MHmakeRandomString(n=40, length=5)
word_sep <- paste(word_vector, collapse=",")
f <- gsub("((?:[^,]*,){10})","\\\\1\
", word_sep)
cat(f, collapse="\
")


我猜你可以用paste

1
2
3
4
5
6
7
paste(word_vector, rep(c(",",",\
"), c(9,1)), collapse ="", sep ="")
[1]"A0ihO, gIUW4, Kh6Xp, sYAXL, IZvuE, PtQvw, zeSEt, YsCo0, WfzbU, 5TTIz,\
oKTOO, qaaTK, y4QUd, C4vNY, lDplP, Gjrg8, UHzUT, 32ZcV, c7xgl, 5Lr2H,\
fDgxt, zFdYO, hohuK, vrNU4, 8oRg5, IYcyl, pblbO, SHhq0, yFjWa, rzYLr,\
m2AXf, QdhtM, TWpkh, 4499K, 5Bcv8, 0DeqI, 6BdTy, fJgKX, tUZeh, HPso5,\
"

此处是使用cat打印时的外观:

1
2
3
4
5
6
7
res <- paste(word_vector, rep(c(",",",\
"), c(9,1)), collapse ="", sep ="")
cat(res)
# A0ihO, gIUW4, Kh6Xp, sYAXL, IZvuE, PtQvw, zeSEt, YsCo0, WfzbU, 5TTIz,
# oKTOO, qaaTK, y4QUd, C4vNY, lDplP, Gjrg8, UHzUT, 32ZcV, c7xgl, 5Lr2H,
# fDgxt, zFdYO, hohuK, vrNU4, 8oRg5, IYcyl, pblbO, SHhq0, yFjWa, rzYLr,
# m2AXf, QdhtM, TWpkh, 4499K, 5Bcv8, 0DeqI, 6BdTy, fJgKX, tUZeh, HPso5,