【问题标题】:Extract numeric and character values from a character variable in data.table R从 data.table R 中的字符变量中提取数字和字符值
【发布时间】:2020-08-14 14:50:23
【问题描述】:

我有以下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 中。

我查看了tidyverseextract 函数,但找不到可以提取numericcharacter 值的内容。 我将data.table 与大型数据集一起使用。省时的功能很棒。

【问题讨论】:

  • df[,doses := sub(".*(\\d.*)|.*","\\1",medication)]??

标签: r data.table character extract numeric


【解决方案1】:

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

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)]

【讨论】:

    【解决方案2】:

    也许你可以试试strsplit,如下所示

    df[-1] <- do.call(rbind,lapply(strsplit(df$medication,"(?<=[A-Za-z])\\s(?=[0-9])",perl = TRUE),`length<-`,2))
    

    给了

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

    【讨论】:

      【解决方案3】:

      extract 的选项来自tidyr

      library(tidyr)
      extract(df, medication, into = c('medication', 'doses'), '(.*)\\s+(\\d+\\s+\\D+)$')
      #   id medication   doses
      #1:  1     Abc de    3 MG
      #2:  2 Afg frt re 4 MG/ML
      #3:  3       <NA>    <NA>
      #4:  4      Aj yr    5 MG
      

      【讨论】:

        【解决方案4】:

        这个方法虽然不是data.table,但是可以考虑

        library(tidyr)
        df %>% 
          separate(medication, into = c("medication", "doses"), sep = "(?=\\d)")
        # 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
        

        【讨论】:

          猜你喜欢
          • 2021-03-26
          • 2022-01-17
          • 1970-01-01
          • 2020-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多