使用 str_detect 和 dplyr 将字符串更改为更简单的文本

change string to simpler text using str_detect and dplyr

我有一个数据集,其中包含许多长而复杂的名称,我正在尝试清理这些名称。例如,我想将 Coal|w/ CCS 更改为 Coal CCS,将 Coal|w/o CCS 更改为 Coal。 我尝试了以下代码来清理它。

Pr_ene<- Pr_en %>% 
  mutate(Variable = case_when(
    str_detect(Variable, "\bPrimary Energy|Coal|w/ CCS\b") ~ "Coal CCS",
    str_detect(Variable, "\bPrimary Energy|Coal|w/o CCS\b") ~ "Coal",
    str_detect(Variable, "\bPrimary Energy|Gas|w/ CCS\b") ~ "Gas CCS",
    str_detect(Variable, "\bPrimary Energy|Gas|w/o CCS\b") ~ "Gas",
    str_detect(Variable, "Nuclear") ~ "Nuclear",         ))

但我最终得到的结果是这样的

 Scenario Variable   X2005   X2010   X2020   X2030 X2040  X2050   X2060   X2070  X2080   X2090   X2100
   <chr>    <chr>      <dbl>   <dbl>   <dbl>   <dbl> <dbl>  <dbl>   <dbl>   <dbl>  <dbl>   <dbl>   <dbl>
 1 xxx1-00  Coal CCS   0       0       0       9.82  22.2  38.2    32.1    15.5     3.92   0.771   0.04 
 2 xxx2-00  Coal CCS 121.    140.    136.     25.4    1.78  0.146   0.054   0.032   0.02   0.012   0.007
 3 xxx3-00  Gas CCS    0       0       0      12.6   50.0  53.1    33.3    14.4     4.03   0.004   0.002
 4 xxx4-00  Gas CCS  100.    106.    122.    127.    89.6  74.7    63.9    54.5    52.3   50.1    52.8  
 5 xxx5-00  Nuclear   

原始数据集:

 Scenario                              Variable    X2005    X2010    X2020    X2030   X2040    X2050    X2060    X2070
1   xxx1-00            Primary Energy|Coal|w/ CCS   0.0000   0.0000   0.0000   9.8220  22.164  38.1680  32.1030  15.4880
2   xxx2-00           Primary Energy|Coal|w/o CCS 121.2930 140.0090 136.4170  25.4090   1.781   0.1460   0.0540   0.0320
3   xxx3-00             Primary Energy|Gas|w/ CCS   0.0000   0.0000   0.0000  12.6250  50.007  53.0870  33.2860  14.4470
4   xxx4-00            Primary Energy|Gas|w/o CCS 100.4820 105.5650 122.0080 127.3080  89.555  74.7170  63.8960  54.4620
5   xxx5-00                Primary Energy|Nuclear   9.9660 

结果应适用于场景 1 煤炭 CCS、2 煤炭、3 天然气 CCS、4 天然气 5 核 我也看过类似的问题,但我无法解决我的问题...... 我感谢任何人的帮助,提前致谢!

正则表达式(就像您在使用 str_detect 时使用的一样)用于在字符串中查找模式。您主要是在进行精确匹配 - 找到整个字符串 "Primary Energy|Coal|w/ CCS",将其替换为 "Coal CCS"。为此,我们不需要正则表达式,因为我们正在查找和修改整个字符串,而不是部分字符串。

我会使用查找 table 和连接:

energy_lookup = tribble(
  ~Variable, ~Result,
  "Primary Energy|Coal|w/ CCS", "Coal CCS",
  "Primary Energy|Coal|w/o CCS", "Coal",
  "Primary Energy|Gas|w/ CCS", "Gas CCS",
  "Primary Energy|Gas|w/o CCS", "Gas",
  "Primary Energy|Nuclear", "Nuclear"
)


Pr_en %>% left_join(energy_lookup, by = "Variable")

如果您有更多类别并且确实想使用正则表达式来概括模式,我可能会分两个阶段进行 - 第一个提取 | 之间的词,第二个粘贴 CCS如果 "w/ CCS" 是字符串的一部分:

Pr_en %>%
  mutate(
    result = str_extract(Variable, pattern = "(?<=\|)[^|]*"),
    result = case_when(
      str_detect(Variable, "w/ CCS") ~ paste(result, "CCS"),
      TRUE ~ result
    )
  )

模式解释 - "(?<=\|)[^|]*"

  • (?<=\|) 是一个 后视 断言。它不是匹配的一部分,但它确保匹配前面有 |。 (而且因为 | 是正则表达式的元字符,我们需要用 \ 转义它,除非它出现在括号中)
  • [^|]* 匹配任意数量的非 | 字符。 ^(括号内)表示“不是”,*表示“任意数”。

|在正则表达式中有特殊含义。这将起作用:

library(dplyr)
library(stringr)
Pr_en <- tibble(
  Variable = c("Primary Energy|Coal|w/ CCS", "Primary Energy|Coal|w/o CCS", "Primary Energy|Gas|w/ CCS", "Primary Energy|Gas|w/o CCS", "Primary Energy|Nuclear")
)

Pr_ene<- Pr_en %>% 
  mutate(
    Variable = case_when(
      str_detect(Variable, "Coal.w/ CCS") ~ "Coal CCS",
      str_detect(Variable, "Coal.w/o CCS") ~ "Coal",
      str_detect(Variable, "Gas.w/ CCS") ~ "Gas CCS",
      str_detect(Variable, "Gas.w/o CCS") ~ "Gas",
      str_detect(Variable, "Nuclear") ~ "Nuclear",
    )
  )
Pr_ene

这里,.是一个占位符。