R按特殊字符“+”拆分字符串,并根据条件对拆分字符串进行分类

R split string by special character "+" and categorize the split strings based on conditions

您好,我需要将 mfn_rate 中的字符串拆分为出现时带有空格“+”的特殊字符,然后 return mfn_av 中它前面的数值和mfn_spec

之后的其余字符串

我正在尝试如下操作:

mfn_rate<-c("25%","25% + 2 GBP/tonne","2 GBP per tonne","10%")
mfn_av<-""
mfn_spec<-""
mfn<-data.frame(mfn_rate,mfn_av,mfn_spec)

for (i in 1:nrow(mfn)){
    #if the value in mfn_rate is not a single percentage value, classify it into either mfn_av or mfn_spec
    if(grepl("+",mfn$mfn_rate[i])){
       mfn$mfn_spec[i] <- str_split(mfn$mfn_rate[i],"\+", "print string after +")
       mfn$mfn_av[i] <- str_split(mfn$mfn_rate[i],"\+", "print numbers before + sign")
    }
    else ( mfn$mfn_rate[i] <- mfn$mfn_av[i])
}

输出应该是例如:

mfn_rate = 25% + 2 GBP/tonne
mfn_av = 25%
mfn_spec = 2 GBP/tonne

tidyverse

中使用 separatestr_detect
library(tidyverse)
mfn_rate<-c("25","25% + 2 GBP/tonne","2 GBP per tonne","10")
mfn <- data.frame(mfn_rate)

mfn <- mfn %>% 
  separate(mfn_rate, c("mfn_av", "mfn_spec"), " \+ ", remove=F) %>% 
  mutate(mfn_spec = if_else(str_detect(mfn_av, "[:alpha:]"), mfn_av, mfn_spec),
         mfn_av = if_else(str_detect(mfn_av, "[:alpha:]"), NA_character_, mfn_av))

输出

> mfn
           mfn_rate mfn_av        mfn_spec
1                25     25            <NA>
2 25% + 2 GBP/tonne    25%     2 GBP/tonne
3   2 GBP per tonne   <NA> 2 GBP per tonne
4                10     10            <NA>