从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
fromtidyr
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”,药物)]
??