假设我在R中有一个特定的字符串,比如"ABCDEFG". 我可以使用以下regex将其分解为每两个字符的序列.

 strsplit("ABCDEFG", "(?<=(..))", perl = TRUE)
[[1]]
[1] "AB" "CD" "EF" "G" 

但我想将其分成特定的序列. 前两个字符,然后下一个字符,然后再两个,然后一个,以此为生.

如果我的输入字符串是"ABCDEFG",我希望"AB""C""DE""F""G"作为输出(在最后一个元素中只剩下一个元素).

我怎么做.我不想提前数nchar,因为我想动态地做.

推荐答案

我们可以概括Edwardrawr的 idea .

> spl_pat <- \(x, p) {
+   stopifnot(all(is.na(p) | p >= 0))
+   if (any(is.na(p))) return(x)  ## compatibility w/ strsplit()
+   if (identical(p, NULL)) p <- 1  ## compatibility w/ strsplit()
+   .spl <- \(x) {
+     pat <- rep_len(p, len=1 + nchar(x)/2)
+     start <- cumsum(c(1, pat[-length(pat)]))
+     stop <- cumsum(pat)
+     Filter(nzchar, substring(x, start, stop))
+   }
+   if (length(x) > 1L) lapply(x, .spl) else .spl(x)
+ }

使用

Single strings, 100:

> spl_pat('ABCDEFG', 2:1)
[1] "AB" "C"  "DE" "F" 
> spl_pat('ABCDEFG', c(1, 4))
[1] "A"    "BCDE" "F"    "G"   
> spl_pat('ABCDEFG', c(0, 4))
[1] "ABCD" "EFG" 
> spl_pat('ABCDEFG', 1:1e3)
[1] "A"   "BC"  "DEF" "G"  
> spl_pat('ABCDEFG', 2)
[1] "AB" "CD" "EF" "G" 
> spl_pat('ABCDEFG', 1)
[1] "A" "B" "C" "D"
> spl_pat('ABCDEFG', 0)
character(0)
> spl_pat('ABCDEFG', NA)
[1] "ABCDEFG"
> spl_pat('ABCDEFG', NULL)
[1] "A" "B" "C" "D"

Multiple strings, 100:

> spl_pat(c('ABCDEFG', 'ABCDEFGHIJ'), 2:1)
[[1]]
[1] "AB" "C"  "DE" "F" 

[[2]]
[1] "AB" "C"  "DE" "F"  "GH" "I" 

Different patterns:

> Vectorize(spl_pat)(c('ABCDEFG', 'ABCDEFGHIJ'), list(2:1, 1:2))
$ABCDEFG
[1] "AB" "C"  "DE" "F" 

$ABCDEFGHIJ
[1] "A"  "BC" "D"  "EF" "G"  "HI"

> Vectorize(spl_pat)(c('ABCDEFG', 'ABCDEFGHIJ', 'ABCDEFGHIJ'), list(2:1, 1:2, 0))
$ABCDEFG
[1] "AB" "C"  "DE" "F" 

$ABCDEFGHIJ
[1] "A"  "BC" "D"  "EF" "G"  "HI"

$ABCDEFGHIJ
[1] ""

p < 0 probably wouldn't make sense, would it?:

> spl_pat('ABCDEFG', -1)
Error in spl_pat("ABCDEFG", -1) : all(is.na(p) | p >= 0) is not TRUE

R相关问答推荐

仅返回R中所有其他列的列ID和年份缺失(NA)数据的列表

R包terra在投影时如何决定模板格栅属性?

R:如何自动化变量创建过程,其中我需要基于ifelse()为现有变量的每个级别创建一个单独的变量

在特定列上滞后n行,同时扩展框架的长度

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

如何删除R中除某些特定名称外的所有字符串?

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

将年度数据插入月度数据

如何在R中添加截止点到ROC曲线图?

修改用R编写的用户定义函数

derrr mutate case_when grepl不能在R中正确返回值

在连续尺度上转置标签[瀑布图,R]

将多列合并为单独的名称—值对

如何在分组条形图中移动相关列?

在RStudio中堆叠条形图和折线图

如何提取所有完美匹配的10个核苷酸在一个成对的匹配与生物字符串在R?>

2个Rscript.exe可执行文件有什么区别?

当我们有多个反斜杠和/特殊字符时使用Gsubing

正在导出默认的RStudio主题,还是设置括号 colored颜色 ?

有没有办法定制Plot(allEffects())面板标题?