使用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
更改为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”)~“气体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,这当然有效:-)感谢您解释所有正则表达式的内容:-)我尝试了你给我的第二个选项,因为我有更多的类别。效果很好!事实上,我最终更多地使用了你的选项,因为我有很多类别,但因为我不完全理解正则表达式,有时它给了我乐趣