从data.table R中的字符变量中提取数字和字符值

问题描述

我有以下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 numeric函数,但是找不到提取characterdata.table值的东西。 我正在将 $('#pesquisarFinal').submit(function(e){ e.preventDefault(); url = '{{ route("disciplina.criar.ano.novo",["curso" => ":id"]) }}'; url = url.replace(":id",$("#curso").val()); $.ajax({ method: "POST",url: url,data: { '_token': '{{ csrf_token() }}',curso: $('#curso').val(),nivel: $('#nivel').val(),semestre: $('#semestre').val() } }).done(function(msg){ oTable.clear().draw(); oTable.rows.add(msg.data).draw(); }); }) 用于大型数据集。节省时间的功能很棒。

解决方法

在第一个数字之前插入@(或您列中尚未存在的任何其他字符),然后使用该字符将列分为两部分:

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[,"doses") := tstrsplit(medication,".(?=[0-9])",perl = TRUE)]
,

也许您可以像下面那样尝试xhr.setRequestHeader('x-requested-with','XMLHttpRequest')

strsplit

给出

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

来自extract的{​​{1}}的选项

tidyr
,

尽管此方法不是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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...