我正在尝试使用 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/