我的输入字符串是数字序列,后跟两个字母中的一个(以任何顺序,也可能是一行中的几个这样的序列):

s <- c("2w", "1p", "3w1p3w", "2p12w2p3w")

以下是我需要的模式(我认为):

pattern <- ([0-9]+w)*([0-9]+p)*

然而,我无法获得所需的输出:

list("2w", "1p", c("3w","1p","3w"), c("2p","12w","2p","3w"))

我试过这个:

(out <- regmatches(s, gregexec(pattern, s)))

但我不理解输出,也不知道如何重新格式化才能得到我想要的:

[[1]]
     [,1]
[1,] "2w"
[2,] "2w"
[3,] ""  

[[2]]
     [,1]
[1,] "1p"
[2,] ""  
[3,] "1p"

[[3]]
     [,1]   [,2]
[1,] "3w1p" "3w"
[2,] "3w"   "3w"
[3,] "1p"   ""  

[[4]]
     [,1] [,2]    [,3]
[1,] "2p" "12w2p" "3w"
[2,] ""   "12w"   "3w"
[3,] "2p" "2p"    ""  

最后,我想将每个字母的所有计数相加,得到如下结果:

data.frame(s=s, w=c(2,0,6,15), p=c(0,1,1,4))
          s  w p
1        2w  2 0
2        1p  0 1
3    3w1p3w  6 1
4 2p12w2p3w 15 4

推荐答案

更简单:在每隔pw后拆分字符串(并保留分隔符)

s <- c("2w", "1p", "3w1p3w", "2p12w2p3w")
ans <- strsplit(s, "(?<=[pw])", perl=TRUE)
 
# [[1]]
# [1] "2w"
# 
# [[2]]
# [1] "1p"
# 
# [[3]]
# [1] "3w" "1p" "3w"
# 
# [[4]]
# [1] "2p"  "12w" "2p"  "3w" 

第二部分

library(data.table)
DT <- rbindlist(lapply(ans, as.data.table), idcol = "id")
DT[, c("value", "letter") := tstrsplit(V1, "(?=[wp])", perl=TRUE, type.convert = TRUE)]
dcast(DT[, .(sum(value)), by = .(id, letter)],id ~ letter, value.var = "V1", fill = 0)[, id := s][]
#           id p  w
# 1:        2w 0  2
# 2:        1p 1  0
# 3:    3w1p3w 1  6
# 4: 2p12w2p3w 4 15

R相关问答推荐

使用lapply的重新定位功能

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

更改绘图上的x轴断点,而不影响风险?

如何在编辑列时更新可编辑数据表,并使用该表在Shiny中执行连续计算

如何优化向量的以下条件赋值?

在ggplot中为不同几何体使用不同的 colored颜色 比例

在R中,我如何使用滑动窗口计算位置,然后进行过滤?

计算直线上点到参考点的总距离

正则表达式在第二个管道和第二个T之后拆分R中的列

如何将一个方阵分解成没有循环的立方体

提高圣彼得堡模拟的速度

SHILINY中DT列的条件着色

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

如何移动点以使它们的打印不重叠

每行不同列上的行求和

有没有办法将勾选/审查标记添加到R中的累积关联图中?

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

R dplyr::带有名称注入(LHS of:=)的函数,稍后在:=的RHS上引用

使用卡环从R中的列中删除单位(&C)

使用循环改进功能( struct 简单)