【问题标题】:Retain string till character limit with last complete word, and store remaining words in 2nd variable将字符串保留到最后一个完整单词的字符限制,并将剩余单词存储在第二个变量中
【发布时间】:2018-01-01 05:36:47
【问题描述】:

以这些示例字符串为例,我想将它们拆分为长度限制为 X 或更少的字符,一个完整的单词位于每个字符串的末尾,其余部分存储在另一列中。单词总是用空格隔开。我遇到了this partial solution in TSQL(不会为多余的单词创建变量)。但是我需要在 R 中执行此操作。在上一个问题中为我提供了前半部分解决方案,这在新变量中没有剩余的单词。我需要帮助来创建新变量

 {gsub(patt="(^.{2,100})([ ].+)", repl="\\1",y)}

例如:

XOVEW VJIEW NI **stays** XOVEW VJIEW NI (assuming X is 14)
XOVEW VJIEW NIGOI **becomes** XOVEW VJIEW (NIGOI goes to a new vector) 
XOVEW VJIEWNIGOI **becomes** XOVEW (assuming X is 14)

所以新变量将包含来自上面第 2 行和第 3 行的 c("NIGOI","VJIEWNIGOI")。

【问题讨论】:

  • v1 <- ifelse( nchar(vect) > 14, gsub( "(.*)\\s+(\\w+)", "\\1 - \\2", vect),vect); values <- data.frame(do.call('rbind', lapply(strsplit(v1,split="-"), `length<-`,2)));,如果这能解决您的问题,请告诉我,其中 vect 是您的输入行,值是最终输出
  • 你明白了。我整天都在做这个!谢谢。你能解释一下这里使用的 do.call 语句吗?

标签: r regex


【解决方案1】:
v1 <- ifelse( nchar(vect) > 14, gsub( "(.*)\\s+(\\w+)", "\\1 - \\2", vect),vect); 

values <- data.frame(do.call('rbind', lapply(strsplit(v1,split="-"), `length<-`,2)));

输出:

     [,1]             [,2]         
[1,] "XOVEW VJIEW NI" NA           
[2,] "XOVEW VJIEW "   " NIGOI"     
[3,] "XOVEW "         " VJIEWNIGOI"

我创建了一个小向量,它将检查您的字符串长度是大于还是小于 14(?nchar,如果您想了解它)。

然后在任何地方,它都超过 14 我创建了一个用破折号分隔的字符串,这只是为了隔离两个字符串,其中第一个字符串表示不是最后一个单词的任何集合,第二个字符串匹配声明的最后一句话。

为了匹配这些,我使用了正则表达式,dot 表示任何字符,star 表示零个或多个匹配项(一起表示任何具有零个或多个匹配项的字符),\\s+ 匹配一个或多个空格,@ 987654327@ 匹配一个或多个单词。总的来说,匹配是这样的,在 ifelse 中字符串长度超过 14 的情况下,它应该将最后一个单词与字符串的其余部分隔离。这些字符也被进一步捕获到\\1 和\\2 中,并用破折号分隔。其中\\1 匹配第一个非最后一个单词匹配,\\2 匹配字符串的最后一个单词。

最后do.call 与rbind(绑定所有行)和lapply(在所有元素中获得偶数列)一起使用

我希望这能解释您的问题。

【讨论】:

  • 是的,我明白了,谢谢你的详细解释。我知道我有 nchar 但无法想出你用来将字符串分成两部分的逻辑。在 do.call('rbind',lapply((strsplit(..)),length&lt;-,2) 中,length&lt;-,2 是干什么用的?
  • 它是一个函数搜索?`length
  • 它的另一种说法长度(x)
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
相关资源
最近更新 更多