【问题标题】:How to split strings of different lengths followed by numbers in R?如何拆分不同长度的字符串,后跟R中的数字?
【发布时间】:2021-10-26 02:32:53
【问题描述】:

根据我之前在这里提出的问题提出一个新问题:我有如下化合物列表:

Ag0.05Zr1.0
Al0.11W1.0
Al0.18Cr1.0
AlFe
AlFe0.2NiCuCoCr
AlFe0.2NiCuCoCz
AlFeNi
AlFeNiCo
AlFeNiCrCo
AlFeNiCrCoCu0.2
AlFeNiCu0.2CoCr
Cr1.0Mo0.33
U0.33Zr1.0
V0.33W1.0
V1.0W1.0

我需要在元素名称之间拆分并放置一个下划线。现在元素名称可以是单个大写字母,或 1 个大写字母后跟一个小写字母。到目前为止,我已经在包含 2 个字母的字符串之间放置了一个“_”。但是,每当涉及单个字母元素时,它都会给出以下内容:

“输入的化合物 Co_1.0_Cu_1.0_Fe_1.0_5_Nb_0.5_6_Ni_1.0 中的元素 V1.0 不存在!”。 (代码生成的错误消息)但是我希望它是以下内容:

“V_1.0_Co_1.0_Cu_1.0_Fe_1.05_Nb_0.56_Ni_1.0”

因此,它不仅将单个字母与数字组合在一起,而且还无法识别所有组合在一起的数字。有人可以帮忙吗?我使用以下代码来实现这一点:

elem = gsub("(?<=[a-z0-9])(?=[0-9A-Z])", "_", elem, perl = TRUE)

其中 elem 是我的化合物列表。

数字基本上是元素分数,所以错误信息应该是这样的:

错误:元素“Cz”(或“Z”是元素周期表中不存在的单个字母元素),“在输入的复合 xyz 中不存在!

【问题讨论】:

  • 请不要将数据添加为图像。我们无法从图像中复制数据。如果您在 reproducible format 中提供数据,则更容易提供帮助
  • 这就够了吗?我已经更新了帖子。我需要帮助来寻找解决方案。任何想法和帮助将不胜感激。
  • 我会尝试在几个gsub 步骤中执行此操作,每次都覆盖elem。尝试提出单个正则表达式可能是可能的,但代价是复杂。

标签: r string split


【解决方案1】:

您可以使用|gsub 中提供多种替换模式。

# data
elem <- c("Ag0.05Zr1.0", "Al0.11W1.0", "Al0.18Cr1.0", "AlFe", "AlFe0.2NiCuCoCr", 
"AlFe0.2NiCuCoCz", "AlFeNi", "AlFeNiCo", "AlFeNiCrCo", "AlFeNiCrCoCu0.2", 
"AlFeNiCu0.2CoCr", "Cr1.0Mo0.33", "U0.33Zr1.0", "V0.33W1.0", "V1.0W1.0")

# solution
elem <- gsub("(?<=[a-z0-9])(?=[A-Z])|(?<=[a-z])(?=[0-9])|(?<=[A-Z])(?=[0-9])", 
    "_", elem, perl = TRUE)

elem
"Ag_0.05_Zr_1.0"
"Al_0.11_W_1.0"
"Al_0.18_Cr_1.0"
"Al_Fe"
"Al_Fe_0.2_Ni_Cu_Co_Cr"
"Al_Fe_0.2_Ni_Cu_Co_Cz"
"Al_Fe_Ni"
"Al_Fe_Ni_Co"
"Al_Fe_Ni_Cr_Co"
"Al_Fe_Ni_Cr_Co_Cu_0.2"
"Al_Fe_Ni_Cu_0.2_Co_Cr"
"Cr_1.0_Mo_0.33"
"U_0.33_Zr_1.0"
"V_0.33_W_1.0"
"V_1.0_W_1.0"

我对原帖中的gsub做了两处修改:

  1. 我将替换模式 (?&lt;=[a-z0-9])(?=[0-9A-Z]) 更改为两个单独的替换模式 (?&lt;=[a-z0-9])(?=[A-Z])|(?&lt;=[a-z])(?=[0-9]),因为原始替换模式也在两位数之间插入了“_”(例如,“Cr_1.0_Mo_0.3_3”)。

  2. 我添加了第三个替换模式(?&lt;=[A-Z])(?=[0-9]) 在大写字母和数字之间插入“_”。

【讨论】:

  • 我认为这是我收到的最好的(/唯一正确的)解决方案。谢谢@LC-datascientist。
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 2022-11-23
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多