我有以下数据框架:
df <- data.frame(
Name= c('AMLOD VALSAR HCT MPH Filmtabl 10+160+25mg 100Stk','ARTHROTEC 50 Bitabs 50+0.2mg 50Stk','GLUCOPHAGE Filmtabl 850mg 100Stk'),
Aug20Cu= c(1000,1831,7430),
Sep20Cu= c(899,822, 1000)
)
Name Aug20Cu Sep20C
1 AMLOD VALSAR HCT MPH Filmtabl 10+160+25mg 100Stk 1000 899
2 ARTHROTEC 50 Bitabs 50+0.2mg 50Stk 1831 822
3 GLUCOPHAGE Filmtabl 850mg 100Stk 7430 1000 我想将第一列“名称”的不同编号提取到单独的列中,从而取得以下结果:
Name a b c Aug20Cu Sep20C
1 AMLOD VALSAR HCT MPH Filmtabl 10+160+25mg 100Stk 10 160 25 1000 899
2 ARTHROTEC 50 Bitabs 50+0.2mg 50Stk 50 0.2 NA 1831 822
3 GLUCOPHAGE Filmtabl 850mg 100Stk 850 NA NA 7430 1000 我尝试了以下代码:
df<-df %>% tidyr::extract(Name,c("a", "b", "c"),'(\\d+(?=\\+))(\\d+(?=\\+))(\\d+(?=mg))',convert=TRUE, remove=FALSE)
或
df<-df %>% tidyr::extract(Name,c("a", "b", "c"),'(\d+(?=\+|mg))',convert=TRUE, remove=FALSE)
我不太理解Regex,因此我不知道自己做错了什么。我尝试在"regex101.com“中创建最后一个Regex代码,它看起来很有效,但是我一在R中尝试它,我就得到了一个奇怪的结果(字符串名的第一个字母)。
发布于 2022-03-17 16:52:00
library(data.table)
# Make df a data.table
setDT(df)
# Extract the part ending on "mg", split on + sign
temp <- tstrsplit(gsub(".* ([0-9+.]+?)mg.*", "\\1", df$Name), "\\+", perl = TRUE)
df[, letters[1:length(temp)] := temp][]
# Name Aug20Cu Sep20Cu a b c
# 1: AMLOD VALSAR HCT MPH Filmtabl 10+160+25mg 100Stk 1000 899 10 160 25
# 2: ARTHROTEC 50 Bitabs 50+0.2mg 50Stk 1831 822 50 0.2 <NA>
# 3: GLUCOPHAGE Filmtabl 850mg 100Stk 7430 1000 850 <NA> <NA>发布于 2022-03-17 17:24:12
一个选项是使用str_extract_all和unnest提取该部分。
library(dplyr)
library(stringr)
library(tidyr)
df %>%
mutate(col1 = str_extract_all(Name, "(?<=\\+)[0-9.]+|[0-9.]+(?=\\+|mg)")) %>%
unnest_wider(col1) %>%
rename_with(~ c("a", "b", "c"), starts_with("...")) %>%
type.convert(as.is = TRUE)-output
# A tibble: 3 × 6
Name Aug20Cu Sep20Cu a b c
<chr> <int> <int> <int> <dbl> <int>
1 AMLOD VALSAR HCT MPH Filmtabl 10+160+25mg 100Stk 1000 899 10 160 25
2 ARTHROTEC 50 Bitabs 50+0.2mg 50Stk 1831 822 50 0.2 NA
3 GLUCOPHAGE Filmtabl 850mg 100Stk 7430 1000 850 NA NAhttps://stackoverflow.com/questions/71515574
复制相似问题