R 如何在每个第n个元素中使用不同的分隔符连接字符串

R 如何在每个第n个元素中使用不同的分隔符连接字符串,r,regex,R,Regex,我想每10个元素用不同的分隔符连接单词(字符串),这样每个单词用逗号分隔,直到每10个单词,然后用逗号和换行符分隔。最终目的是将单词列表整齐地打印到表格中 我可以编写一个循环,但我希望通过使用gsub和正则表达式,可以得到这些相关问题中提出的更优雅的解决方案: 这涉及到在每个第n个字符后插入/替换字符串,但在我的例子中,我的单词的长度(字符数)是可变的 编辑:我正在寻找可以应用于任何字数可变的向量的解决方案 对于可复制的数据,我使用此代码生成一个包含40个随机字的向量 当前表格输出:在这种情况下

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

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

编辑:我正在寻找可以应用于任何字数可变的向量的解决方案

对于可复制的数据,我使用此代码生成一个包含40个随机字的向量

当前表格输出:在这种情况下,我有一个很长的单词列表和指定的表格宽度,所以我需要换行符。

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

word_sep2 <- paste(c(paste(MHmakeRandomString(n=10, length=5), collapse=", "), ",\n",
               paste(MHmakeRandomString(n=10, length=5), collapse=", "), ",\n",
               paste(MHmakeRandomString(n=10, length=5), collapse=", "), ",\n",
               paste(MHmakeRandomString(n=10, length=5), collapse=", ")), collapse="")
word_sep2
# [1] "0ahiL, 2pA5c, dKWuR, 79sw5, MeL1I, KpB1w, UNLSo, LlDlN, jNOcI, tv8R5,
# \norf60, avKFo, jZFxE, U7RQW, SSmxD, czlMt, 75zEB, 2jLwG, 08dmN, H3sVW,
# \nCZwQt, ggumo, wHUpj, Z7WGR, BHYLE, eWksX, Lbt3D, P1Brf, OpEvk, 1WFVa,
# \nEeFd4, afX7B, nyBzF, vbNLz, U7MU0, H4rx4, AKgv8, Kbzri, KKajp, Yg6EW"

plot_grid(tableGrob(word_sep2))

word\u sep2I gues您可以使用
paste

paste(word_vector, rep(c(", ", ",\n"), c(9,1)), collapse = "", sep = "")
[1] "A0ihO, gIUW4, Kh6Xp, sYAXL, IZvuE, PtQvw, zeSEt, YsCo0, WfzbU, 5TTIz,\noKTOO, qaaTK, y4QUd, C4vNY, lDplP, Gjrg8, UHzUT, 32ZcV, c7xgl, 5Lr2H,\nfDgxt, zFdYO, hohuK, vrNU4, 8oRg5, IYcyl, pblbO, SHhq0, yFjWa, rzYLr,\nm2AXf, QdhtM, TWpkh, 4499K, 5Bcv8, 0DeqI, 6BdTy, fJgKX, tUZeh, HPso5,\n"
以下是使用
cat
打印时的外观:

res <- paste(word_vector, rep(c(", ", ",\n"), 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,
res您可以使用

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

详细信息

  • (((?:[^,]*,){10})
    -组1(在替换模式中用
    \1
    引用),与10个连续出现的
    • [^,]*
      -除
      以外的任何0+字符
    • -逗号
  • -空格
见:


谢谢!有没有删除最后一个逗号的建议?看起来像是你想要的。@WiktorStribiżew beauty,正是我想要的。如果你把它作为一个答案,很乐意接受。谢谢你提供的额外细节,非常有用@乔克:很乐意帮忙。另外,请看。哇,regex演示网站是一个很好的资源!多谢。
res <- paste(word_vector, rep(c(", ", ",\n"), 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,
gsub("((?:[^,]*,){10}) ", "\\1\n", word_sep)
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\n", word_sep)
cat(f, collapse="\n")