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

从data.R表中的字符变量中提取数字和字符值,r,data.table,character,extract,numeric,R,Data.table,Character,Extract,Numeric,我有以下数据。表 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")) 我想从药物中提取剂量,并创建一个名为doges id medication doses 1: 1 Abc de 3 MG 2: 2 A

我有以下
数据。表

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"))
我想从药物中提取剂量,并创建一个名为
doges

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
id药物剂量
1:1 Abc de 3 MG
2:2 Afg frt re 4 MG/ML
3:3啊
4:4AJ年5毫克
它应该包含数字和单位。并非每种药物都有一个编号和单位,应包含为
NA

我查看了
tidyverse
extract
函数,但找不到可提取
数值
字符
值的内容。
我正在使用
data.table
和一个大数据集。一个省时的函数很好。

也许你可以试试下面的
strsplit

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

df[-1]也许你可以试试下面的
strsplit

df[-1] <- do.call(rbind,lapply(strsplit(df$medication,"(?<=[A-Za-z])\\s(?=[0-9])",perl = TRUE),`length<-`,2))
df[-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
在第一个数字前面插入一个
@
(或列中尚未包含的任何其他字符),然后使用该字符将列一分为二:

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

带有
extract
from
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
library(tidyr)
提取(df,药物,放入=c('药物','剂量'),'(.*)\\s+(\\d+\\s+\\d+)$)
#id药物剂量
#1:1 Abc de 3 MG
#2:2 Afg frt re 4 MG/ML
#3:  3           
#4:4AJ年5毫克

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
library(tidyr)
提取(df,药物,放入=c('药物','剂量'),'(.*)\\s+(\\d+\\s+\\d+)$)
#id药物剂量
#1:1 Abc de 3 MG
#2:2 Afg frt re 4 MG/ML
#3:  3           
#4:4AJ年5毫克

虽然此方法不是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
library(tidyr)
df%>%
单独(药物,分为=c(“药物”,“剂量”),sep=“(?=\\d)”)
#id药物剂量
#1 1 Abc de 3 MG
#2 2 Afg frt re 4 MG/ML
#3啊
#4 Aj年5毫克

虽然此方法不是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
library(tidyr)
df%>%
单独(药物,分为=c(“药物”,“剂量”),sep=“(?=\\d)”)
#id药物剂量
#1 1 Abc de 3 MG
#2 2 Afg frt re 4 MG/ML
#3啊
#4 Aj年5毫克
df[,剂量:=sub(.*(\\d.*)|.*,“\\1”,药物)]
df[,剂量:=sub(.*(\\d.*)|.*,“\\1”,药物)]
??