我正在寻找两个可以执行以下字符串重排的R函数: (1)将部分放在字符串开头的字符串中的“,”之后,例如
name="2,6-Octadien-1-ol, 3,7-dimethyl-, (E)-"
应该产生
"(E)-3,7-dimethyl-2,6-Octadien-1-ol"
(请注意,字符串中可能有任何数量的“,”,或者根本没有,并且“,”之后的部分应该连续放置在字符串的开头,从结尾开始在R中实现这个目标的最有效方法是什么?(不使用循环等)?
(2)将部分放在“<”之间和“>”在字符串的开头并删除任何“,”。 例如。
name="Pyrazine <2-acetyl-, 3-ethyl->"
应该产生
"2-acetyl-3-ethyl-Pyrazine"
(这是一个更简单的gsub问题,对吧?) “&lt;”之间的部分和“&gt;”可能在字符串中的任何位置。 E.g。
name="Cyclohexanol <4-tertbutyl-> acetate"
应该产生
"4-tertbutyl-Cyclohexanol acetate"
欢迎任何想法!
欢呼声, 汤姆
答案 0 :(得分:1)
第一个问题:
name <- c("2,6-Octadien-1-ol, 3,7-dimethyl-, (E)-",
"2,6-Octadien-1-ol,3,7-dimethyl-,(E)-")
sapply(strsplit(name, "(?<!\\d), ?", perl = TRUE), function(x)
paste(rev(x), collapse = ""))
# [1] "(E)-3,7-dimethyl-2,6-Octadien-1-ol" "(E)-3,7-dimethyl-2,6-Octadien-1-ol"
第二个问题:
name <- c("Pyrazine <2-acetyl-, 3-ethyl->",
"Cyclohexanol <4-tertbutyl-> acetate")
inside <- gsub(", ", "", sub("^.*<(.+)>.*$", "\\1", name))
outside <- sub("^(.*) <.*>(.*)$" , "\\1\\2", name)
paste0(inside, outside)
# [1] "2-acetyl-3-ethyl-Pyrazine" "4-tertbutyl-Cyclohexanol acetate"