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

使用str_detect和dplyr将字符串更改为更简单的文本,r,dplyr,stringr,R,Dplyr,Stringr,我有一个数据集,其中有许多长而复杂的名称,我正试图清理这些名称。例如,我想将Coal | w/CCS更改为justCoal-CCS,将Coal | w/o-CCS更改为justCoal。 我尝试了以下代码来清理它 Pr_ene% 变异(变量=情况)( str|u detect(变量,“\b一次能源|煤炭| w/CCS\b”)~“煤炭CCS”, str|U检测(变量,“\b一次能源|煤炭|不含CCS”~“煤炭”, str|u detect(变量,“\b一次能源|气体| w/CCS\b”)~“气体C

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

Pr_ene%
变异(变量=情况)(
str|u detect(变量,“\b一次能源|煤炭| w/CCS\b”)~“煤炭CCS”,
str|U检测(变量,“\b一次能源|煤炭|不含CCS”~“煤炭”,
str|u detect(变量,“\b一次能源|气体| w/CCS\b”)~“气体CCS”,
str|u detect(变量,“\b一次能源|气体|不含CCS”~“气体”,
str_detect(变量“Nuclear”)~“Nuclear”,)
但我最终得到了这样的结果

场景变量X2005 X2010 X2020 X2030 X2040 X2050 X2060 X2070 X2080 X2090 X2100
1 xxx1-00煤炭CCS 0 0 9.82 22.2 38.2 32.1 15.5 3.92 0.771 0.04
2 xxx2-00煤炭CCS 121。14013625.4    1.78  0.146   0.054   0.032   0.02   0.012   0.007
3 xxx3-00气体CCS 0 0 0 12.6 50.0 53.1 33.3 14.4 4.03 0.004 0.002
4 xxx4-00气体CCS 100。10612212789.6  74.7    63.9    54.5    52.3   50.1    52.8  
5 xxx5-00核电
原始数据集:

场景变量X2005 X2010 X2020 X2030 X2040 X2050 X2060 X2070
1 xxx1-00一次能源|煤| w/CCS 0.0000 0.0000 9.8220 22.164 38.1680 32.1030 15.4880
2 xxx2-00一次能源|煤|不含CCS 121.2930 140.0090 136.4170 25.4090 1.781 0.1460.0540 0.0320
3 xxx3-00一次能源|天然气| w/CCS 0.0000 0.0000 12.6250.007 53.0870 33.2860 14.4470
4 xxx4-00一次能源天然气,不含CCS 100.4820 105.5650 122.0080 127.3080 89.555 74.7170 63.8960 54.4620
5 xxx5-00一次能源|核能9.9660
结果应适用于情景1煤炭CCS、2煤炭CCS、3气体CCS、4气体CCS和5核CCS 我也研究过类似的问题,但我无法解决我的问题。。。 我感谢任何人的帮助,提前谢谢

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

我将使用查找表和联接:

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
    )
  )
Pr_en%>%
变异(
result=str_extract(Variable,pattern=“(?Regex(就像您在使用
str_detect
)时使用的)用于在字符串中查找模式。您主要是在进行精确匹配-找到整个字符串
“一次能源|煤炭| w/CCS”
,将其替换为
“煤炭CCS”“
。为此,我们不需要正则表达式,因为我们正在查看和修改整个字符串,而不是字符串的一部分

我将使用查找表和联接:

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
    )
  )
Pr_en%>%
变异(

result=str_extract(Variable,pattern=“(?The
|
在正则表达式中有特殊含义。这将起作用:

库(dplyr)
图书馆(stringr)

Pr_en在正则表达式中,
具有特殊的含义。这将起作用:

库(dplyr)
图书馆(stringr)

谢谢你解释所有正则表达式的内容:-)我尝试了你给我的第二个选项,因为我有更多的类别。效果很好!事实上,我最终更多地使用了你的选项,因为我有很多类别,但因为我不完全理解正则表达式,有时它会给我一些有趣的东西。例如,我有一个名为
二次能源|电力|生物质
的类别,我使用你的代码此修改
result=case\u当(str\u detect(变量,“biomative”)~paste(结果,“biomative”)时
然后它给了我一个
电生物量
的结果,我只想要
生物量
,帮助?@GregorThomasI试图概括我在问题中的样本数据中看到的模式。我看到的模式是,你想提取管道之间的标签部分,所以我编写了一个正则表达式模式来查找管道,然后提取管道后面的内容,在管柱末端或另一管道处停止。因此
“一次能源|燃气| w/o CCS”
产生
“燃气”
“一次能源|核能”
产生
“核能”
,这种新情况
“二次能源|电力|生物质”
产生
“电力”“
因为这是管道之间的内容。在某些情况下,我的代码会继续将
“CCS”
粘贴到提取的结果上。如果要将任何具有“生物量”的内容简单地标记为“生物量”,然后您可以在
时修改您的
case\u,以跳过
粘贴
,替换提取的字符串而不是粘贴到它:
result=case\u当(str\u detect(Variable,“biome”)~“biome”)
Brilliant,这当然有效:-)感谢您解释所有正则表达式的内容:-)我尝试了你给我的第二个选项,因为我有更多的类别。效果很好!事实上,我最终更多地使用了你的选项,因为我有很多类别,但因为我不完全理解正则表达式,有时它给了我乐趣