代码之家  ›  专栏  ›  技术社区  ›  pyeR_biz

将字符串保留到最后一个完整单词的字符限制,并将剩余单词存储在第二个变量中

  •  2
  • pyeR_biz  · 技术社区  · 7 年前

    以这些字符串为例,我想拆分它们,使其长度限制为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)
    

    所以新变量将包含 c("NIGOI","VJIEWNIGOI") 来自上面第二排和第三排。

    1 回复  |  直到 7 年前
        1
  •  1
  •   PKumar    7 年前
    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长,我创建了一个用破折号分隔的字符串,这只是为了分隔两个字符串,其中第一个字符串代表任何不是最后一个的单词集合,第二个字符串匹配语句的最后一个单词。

    为了匹配这些,我使用了regex,a dot 表示任何字符 star 零个或多个匹配项(合在一起表示任何具有零个或多个匹配项的字符) \\s+ 匹配1个或多个空格和 \\w+ 匹配一个或多个单词。总的来说,如果ifelse中的字符串长度超过14,则匹配应将最后一个单词与字符串的其余部分隔离。此外,这些角色还被进一步捕获到 \\1 \\2 用破折号分隔。哪里 \\1 匹配第一个非最后一个单词匹配,并且 \\2 匹配字符串的最后一个单词。

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

    我希望这能解释你的疑问。