R 将列中的字符串拆分为固定长度的子字符串

R 将列中的字符串拆分为固定长度的子字符串,r,regex,data.table,R,Regex,Data.table,以下是我的模拟代码和数据: library(data.table) library(stringr) data <- data.table(string = c("aaaaaaaaa", "bbbbbb", "ccccccccccccccc", "aaa")) data[, length := nchar(string)] data string length 1: aaaaaaaaa 9 2: bbbbbb 6

以下是我的模拟代码和数据:

library(data.table)
library(stringr)

data <- data.table(string = c("aaaaaaaaa", "bbbbbb", "ccccccccccccccc", "aaa"))
data[, length := nchar(string)]

data
            string length
1:       aaaaaaaaa      9
2:          bbbbbb      6
3: ccccccccccccccc     15
4:             aaa      3
这让我得到了我想要的结果——无论多么缓慢

> data
            string length                       split
1:       aaaaaaaaa      9             aaa - aaa - aaa
2:          bbbbbb      6                   bbb - bbb
3: ccccccccccccccc     15 ccc - ccc - ccc - ccc - ccc
4:             aaa      3                         aaa
我正在寻找一个不使用
for
循环的解决方案,所以我猜它一定是基于
regex

请注意,
string
列的长度可能不同,但始终是3的倍数,并且必须始终分成3组


非常感谢

你可以试试这个
(?您可以尝试此操作。
(?我们可以使用
strsplit
将每3个字符上的字符串拆分,并将其粘贴到一个字符串中

library(data.table)
data[, split := lapply(strsplit(string, "(?<=.{3})", perl=TRUE), 
                paste, collapse = " - ")]

data
#            string                       split
#1:       aaaaaaaaa             aaa - aaa - aaa
#2:          bbbbbb                   bbb - bbb
#3: ccccccccccccccc ccc - ccc - ccc - ccc - ccc
#4:             aaa                         aaa
库(data.table)

data[,split:=lappy(strsplit)(string,”(?我们可以使用
strsplit
将每3个字符上的字符串拆分,并将其粘贴到一个字符串中

library(data.table)
data[, split := lapply(strsplit(string, "(?<=.{3})", perl=TRUE), 
                paste, collapse = " - ")]

data
#            string                       split
#1:       aaaaaaaaa             aaa - aaa - aaa
#2:          bbbbbb                   bbb - bbb
#3: ccccccccccccccc ccc - ccc - ccc - ccc - ccc
#4:             aaa                         aaa
库(data.table)

data[,split:=lapply(strsplit(string),(?我们可以用
gsub

data[, split := trimws(gsub("(...)", "\\1 - ", string), whitespace = '[- ]')][]
#             string length                       split
#1:       aaaaaaaaa      9             aaa - aaa - aaa
#2:          bbbbbb      6                   bbb - bbb
#3: ccccccccccccccc     15 ccc - ccc - ccc - ccc - ccc
#4:             aaa      3                         aaa

我们可以使用
gsub

data[, split := trimws(gsub("(...)", "\\1 - ", string), whitespace = '[- ]')][]
#             string length                       split
#1:       aaaaaaaaa      9             aaa - aaa - aaa
#2:          bbbbbb      6                   bbb - bbb
#3: ccccccccccccccc     15 ccc - ccc - ccc - ccc - ccc
#4:             aaa      3                         aaa

您能确认设置了
perl
标志时
\G..
也能正常工作吗?@revo
strsplit(数据$string,“\\G..”,perl=TRUE)
给出空字符串可能是因为它与字符匹配,而不是与位置匹配?您能否确认
\G..
在设置
perl
标志时也能工作?@revo
strsplit(数据$string,“\\G..”,perl=TRUE)
给出空字符串可能是因为它匹配字符而不是匹配位置?