How to concatenate strings with different separator every n-th element
我想每10个元素用不同的分隔符连接单词(字符串),这样每个单词都用逗号分隔,直到每10个单词再用逗号和换行符分隔。最终目的是将单词列表整齐地打印到表格中。
我可以编写一个循环,但是我希望使用
在这里和这里涉及到在每个第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" |
我通常会执行
打印到表格
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)) |
当前表输出:在这种情况下,我的单词列表和指定的表宽度非常长,因此需要换行。
我想要的输出看起来像这个被黑的版本:
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)) |
所需的表输出:
您可以使用
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="\ ") |
我猜你可以用
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,\ " |
此处是使用
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, |