R 根据特定条件更改字符串列表

R 根据特定条件更改字符串列表,r,string,R,String,我这里有一个字符串列表 List <- c('C8 H12 O1 Na1', 'C15 H20 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1', 'C26 H38 O5 Na1') List使用sub我们可以删除末尾的Na\\d+,同时使用gsubfn减去1 library(gsubfn) new <- sub("\\sNa\\d+$", "", List) i1 <- grep("\\bNa\\d+$", List, invert = TRU

我这里有一个字符串列表

List <- c('C8 H12 O1 Na1', 'C15 H20 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1', 'C26 H38 O5 Na1')

List使用
sub
我们可以删除末尾的
Na\\d+
,同时使用
gsubfn减去1

library(gsubfn)
new <- sub("\\sNa\\d+$", "", List)
i1 <- grep("\\bNa\\d+$", List, invert = TRUE)
new[i1] <- gsubfn("H\\d+", ~ paste0(substring(x,  1, 1),
    as.numeric(substring(x, 2))-1), new[i1])
new
#[1] "C8 H12 O1"  "C15 H20 O7" "C18 H23 O6" "C24 H32 O9" "C26 H38 O5"
库(gsubfn)

新建使用
sub
我们可以删除结尾处的
Na\\d+
,同时使用
gsubfn减去1

library(gsubfn)
new <- sub("\\sNa\\d+$", "", List)
i1 <- grep("\\bNa\\d+$", List, invert = TRUE)
new[i1] <- gsubfn("H\\d+", ~ paste0(substring(x,  1, 1),
    as.numeric(substring(x, 2))-1), new[i1])
new
#[1] "C8 H12 O1"  "C15 H20 O7" "C18 H23 O6" "C24 H32 O9" "C26 H38 O5"
库(gsubfn)

新的这是我在评论中建议的想法的一个实现-我们分解字符串,然后删除
Na1
或将
H
减少1。然后我们将它粘贴在一起,并返回一个向量

sapply(strsplit(List," "), function(x) {if (any(grepl("Na",x))) {x[grepl("Na",x)]<-""} else 
                                {x[grepl("H",x)]<-paste0("H",readr::parse_number(x[grepl("H",x)])-1)}
                             return(trimws(paste(x,collapse=" ")))
                            })

[1] "C8 H12 O1"  "C15 H20 O7" "C18 H23 O6" "C24 H32 O9" "C26 H38 O5"

sapply(strsplit(List,”),函数(x){if(any)(grepl(“Na”,x)){x[grepl(“Na”,x)]这是我在评论中建议的想法的一个实现-我们分解字符串,然后移除
Na1
或将
H
减少1。然后我们
将它们全部粘贴在一起并返回一个向量

sapply(strsplit(List," "), function(x) {if (any(grepl("Na",x))) {x[grepl("Na",x)]<-""} else 
                                {x[grepl("H",x)]<-paste0("H",readr::parse_number(x[grepl("H",x)])-1)}
                             return(trimws(paste(x,collapse=" ")))
                            })

[1] "C8 H12 O1"  "C15 H20 O7" "C18 H23 O6" "C24 H32 O9" "C26 H38 O5"
另一种方法可以是:

nums <- as.numeric(stringr::str_extract(List, '(?<=H)(\\d+)' ))-1
## subtracting every integer attached with H by 1
no_na <- grep('\\bNa\\d+\\b',List, invert = TRUE)
## picking the spot where Na is missing
replacement = unlist(lapply(no_na,function(x)gsub('(H)(\\d+)',paste0('\\1',nums[x]), List[x], perl = TRUE)))   
## replacing only that subtracted value which has no Na
List[no_na] <- replacement
## finally replacing using gsub Na followed by digit by ''
fout <- trimws(gsub('\\bNa\\d+\\b', '', List))
另一种方法可以是:

nums <- as.numeric(stringr::str_extract(List, '(?<=H)(\\d+)' ))-1
## subtracting every integer attached with H by 1
no_na <- grep('\\bNa\\d+\\b',List, invert = TRUE)
## picking the spot where Na is missing
replacement = unlist(lapply(no_na,function(x)gsub('(H)(\\d+)',paste0('\\1',nums[x]), List[x], perl = TRUE)))   
## replacing only that subtracted value which has no Na
List[no_na] <- replacement
## finally replacing using gsub Na followed by digit by ''
fout <- trimws(gsub('\\bNa\\d+\\b', '', List))

使用一些
stringr
函数,测试是否存在
“\\bNa\\d+”
,提取H后的数字,然后减小它

库(stringr)
列表%>%
ifelse(str_detect(,“\\bNa\\d+”),
.,

str_用一些
stringr
函数替换(,“(?),测试是否存在
“\\bNa\\d+”
,提取H后的数字,然后减小它

库(stringr)
列表%>%
ifelse(str_detect(,“\\bNa\\d+”),
.,

str_替换(,”(?您需要将字符串分解为矩阵/数据框,在其中进行更改,然后重新创建字符串。您需要将字符串分解为矩阵/数据框,在其中进行更改,然后重新创建字符串。如果我不清楚,请原谅-删除Na很容易,但我的问题是我问题的第二部分(如果不存在Na,则将H减少1)建议在分别捕获H和数字的基础上,对gsubfn行进行轻微简化,避免使用
子字符串
新[i1]如果我不清楚,很抱歉-仅删除Na很容易,但我的问题在于问题的第二部分(如果不存在Na,则将H减少1)建议在分别捕获H和数字的基础上对gsubfn行进行轻微简化,避免使用
子字符串
新[i1]呜呜,忘记了strsplit部分…现在修复。呜呜,忘记了strsplit部分…现在修复。