首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tidyr::Regex萃取物

tidyr::Regex萃取物
EN

Stack Overflow用户
提问于 2022-03-17 16:07:14
回答 2查看 51关注 0票数 1

我有以下数据框架:

代码语言:javascript
复制
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    

我想将第一列“名称”的不同编号提取到单独的列中,从而取得以下结果:

代码语言:javascript
复制
   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中尝试它,我就得到了一个奇怪的结果(字符串名的第一个字母)。

EN

回答 2

Stack Overflow用户

发布于 2022-03-17 16:52:00

代码语言:javascript
复制
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>
票数 2
EN

Stack Overflow用户

发布于 2022-03-17 17:24:12

一个选项是使用str_extract_allunnest提取该部分。

代码语言:javascript
复制
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

代码语言:javascript
复制
# 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      NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71515574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档