r - Tidyr 与可选组分开

标签 r regex tidyverse tidyr

我正在尝试使用 tidyr 包中的 extract 将包含单个字符串的列拆分为 3 个单独的列。该问题的最小工作示例如下:

# A tibble: 3 x 1
  question_codes   
  <chr>            
1 QBL10, QF14, QM20
2 QBL1, QF4        
3 QM10  

其中问题代码 QBL、QF 和 QM 对应于基线、每两周和每月的问题。我想将它们分成单独的列,在不存在代码的地方用 NA 填充。结果应如下所示:

# A tibble: 3 x 4
  question_codes    Base  Fortnightly Monthly
  <chr>             <chr> <chr>       <chr>  
1 QBL10, QF14, QM20 QBL10 QF14        QM20   
2 QBL1, QF4         QBL1  QF4         NA     
3 QM10              NA    NA          QM10 

不幸的是,我无法让正则表达式为此正确工作。我尝试过使用 df %>% extract(question_codes, into = c("基础", "每两周", "每月"), "^(QBL[1-9].*)?, (QF[1-9]. *)?, (QM[1-9].*)?", 删除 = FALSE)

但这没有正确指定可选组并导致:

# A tibble: 3 x 4
  question_codes    Base  Fortnightly Monthly
  <chr>             <chr> <chr>       <chr>  
1 QBL10, QF14, QM20 QBL10 QF14        QM20   
2 QBL1, QF4         NA    NA          NA     
3 QM10              NA    NA          NA 

我是一个正则表达式新手,因此非常感谢任何帮助!

最佳答案

使用模式:

 pat = '(?:(QBL\\d+),)?\\s*(?:(QF\\d+),)?\\s*(QM\\d+)?'

这里所有的组都是可选的。即我们在每个组上使用 ? 以获得 0 或 1 匹配


df %>%
     extract(question_codes, c('a', 'b', 'c'), regex = pat,remove = FALSE)

    question_codes     B    F    M
1 QBL10, QF14, QM20 QBL10 QF14 QM20
2         QBL1, QF4  QBL1          
3              QM10            QM10

关于r - Tidyr 与可选组分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67807641/

相关文章:

java - NOT 表达式的正则表达式帮助

r - 如何从 R 中的多个 id 中获取独占和总计数

R - 改变表格的顺序

r - 并行包在 R 3.3.1 (Ubuntu 14.04) 中不可用

r - Windows 脚本宿主失败

php - 替换字符串中的重复字符串

r - 在 map 函数中迭代应用 ggplot 函数

r - 使用 sqldf 精确连接 id 和滞后窗口中的最近日期

r - R中的多重相关系数

Javascript 正则表达式转义引号(但不转义已经转义的引号)