每n个单词换行的R函数?

4
我希望创建一个R函数,该函数在字符串中的每n个单词后面插入“\n”(其中n是一个参数)。
例如:
startstring <- "I like to eat fried potatoes with gravy for dinner."

myfunction(startstring, 4)

would give:

"I like to eat\nfried potatoes with gravy\nfor dinner."

我认为要做到这一点,我需要将字符串分成数个部分,每个部分包含n个单词,然后用"\n"作为分隔符将它们组合在一起。然而我不知道如何进行初始的分割步骤。
有人能提供建议吗?

请查看 Base R 中的 strsplit() - Len Greski
4个回答

5
你可以使用正则表达式解决这个问题,或者使用以下这种可怕的方法:
words = strsplit(startstring, ' ')[[1L]]
splits = cut(seq_along(words), breaks = seq(0L, length(words) + 4L, by = 4L))
paste(lapply(split(words, splits), paste, collapse = ' '), collapse = '\n')

但对于大多数实际应用程序而言,更好的方法是使用 strwrap 在给定列长度处换行文本,而不是按单词计数:

paste(strwrap(startstring, 20), collapse = '\n')

谢谢,这对我所需的非常有用! - Mel

2

你可以使用 gsub 创建一个 R 函数 ,将每 N 个单词后插入一个 \n ,其中 N 是一个参数。

fun <- function(str, n) {gsub(paste0("([^ ]+( +[^ ]+){",n-1,"}) +"),
                              "\\1\n", str)}
fun(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."
fun(startstring, 2)
#[1] "I like\nto eat\nfried potatoes\nwith gravy\nfor dinner."

[^ ]+ 匹配除了长度至少为1的空格以外的任何内容。 ( +[^ ]+){3} 匹配至少一个空格 +,后跟至少一个非空格字符[^ ]+,在此情况下重复三次{3}

或者可以使用模式中的\\K替代x中的\\1

fun <- function(str, n) {gsub(paste0("[^ ]+( +[^ ]+){",n-1,"}\\K +"),
                              "\n", str, perl=TRUE)}

或者通过使用strsplit函数:

fun2 <- function(str, n) {
  paste0(strsplit(str, " +")[[1L]], c(rep(" ",n-1),"\n"), collapse = "")}
fun2(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner. "

或者没有空格或者\n在结尾:

fun3 <- function(str, n) {
  . <- strsplit(str, " +")[[1L]]
  paste0(., c(rep_len(c(rep(" ",n-1),"\n"), length(.)-1), ""), collapse = "")}
fun3(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."

或者在 strsplit 中使用 \K 保留匹配的单词:

fun4 <- function(str, n) {paste(strsplit(str,
   paste0("[^ ]+( +[^ ]+){",n-1,"}\\K +"), perl=TRUE)[[1L]], collapse="\n")}
fun4(startstring, 4)
#[1] "I like to eat\nfried potatoes with gravy\nfor dinner."

2
您可以使用以下代码:
gsub("([a-z0-9]* [a-z0-9]* [a-z0-9]* [a-z0-9]*) ", "\\1\n", startstring)

1
看起来我采用了和你一样的方法,花了我一点时间才意识到只有在最后一个“单词”后面加上尾随空格才能正常工作。 - Daniel O
1
看一下我的修改后的答案,基于原始问题的期望输出,那个尾随空格应该在括号外面。 - Daniel O
是的,你说得对兄弟...... @DanielO 谢谢。我已经编辑了我的答案。 - Harshal Gajare

1
这段文字使用空格来分隔单词,在Base-R中。
gsub("(\\S* \\S* \\S* \\S*) ","\\1\n",startstring) 
[1] "I like to eat\nfried potatoes with gravy\nfor dinner."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接