使用 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
这里,.
是一个占位符。
我有一个数据集,其中包含许多长而复杂的名称,我正在尝试清理这些名称。例如,我想将 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
这里,.
是一个占位符。