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部分…现在修复。