获取这些示例字符串,我想将它们拆分为长度限制为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")
。
答案 0 :(得分: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+
匹配1个或多个空格,\\w+
匹配一个或多个单词。总的来说,匹配是这样的,如果在ifelse中字符串长度大于14,它应该具有与字符串的其余部分隔离的最后一个字。此外,这些字符还会以{dash}分隔进入\\1
和\\2
。其中\\1
匹配第一个非最后一个字匹配,\\2
匹配字符串的最后一个字。
最后do.call
与rbind
一起使用(绑定所有行)和lapply
(以便在所有元素中获得偶数列)
我希望这可以解释您的疑问。