首页 > 解决方案 > 从 data.table R 中的字符变量中提取数字和字符值

问题描述

我有以下data.table

df <- data.table(id=c(1,2,3,4),
                 medication=c("Abc de 3 MG", "Afg frt re 4 MG/ML","Agh","Aj yr 5 MG"))

id         medication
1:  1        Abc de 3 MG
2:  2 Afg frt re 4 MG/ML
3:  3                Agh
4:  4         Aj yr 5 MG

我想从药物中提取剂量,并创建一个名为doses

id medication   doses
1:  1     Abc de    3 MG
2:  2 Afg frt re 4 MG/ML
3:  3        Agh    <NA>
4:  4      Aj yr    5 MG

它应该包含数字和单位。并非每种药物都有一个编号和单位,应包括在内NA

我查看了tidyverse extract函数,但找不到要提取的内容numericcharacter值。我正在使用data.table大型数据集。省时的功能很棒。

标签: rdata.tablecharacterextractnumeric

解决方案


在第一个数字之前插入一个@(或任何其他不在您的列中的字符),然后使用它将列一分为二:

df[, c("medication", "doses") := tstrsplit(sub("([0-9])", "@\\1", medication), "@")]
df

#    id  medication   doses
# 1:  1     Abc de     3 MG
# 2:  2 Afg frt re  4 MG/ML
# 3:  3         Agh    <NA>
# 4:  4      Aj yr     5 MG

编辑

一个更干净的解决方案是使用稍微高级的正则表达式(正前瞻),只需要记住perl = TRUE

df[, c("medication", "doses") := tstrsplit(medication, ".(?=[0-9])", perl = TRUE)]

推荐阅读