如何在R语言中为提取后的字符串向量添加索引的正负符号?
问题描述
我有一个字符串向量Vector,还有一组索引值index,索引可以是正数或负数。通过Vector2 <- Vector[abs(index)]能从原向量里提取需要的元素。
需求:能不能从index里提取正负符号(-或+),加到Vector2的元素之间,得到目标输出Desired_output?
注:这只是示例,Vector可以是任意长度、任意字符元素的向量,index的长度小于Vector,需要函数式的解决方案。
示例代码:
Vector <- c("advanced baseline", "beginner baseline", "intermediate baseline", "advanced post1", "beginner post1", "intermediate post1", "advanced post2", "beginner post2", "intermediate post2") index = c(8,-2,-7,1) ( Vector2 <- Vector[abs(index)] ) Desired_output <- "beginner post2 - beginner baseline - advanced post2 + advanced baseline"
解决方案
可以用下面的函数式方法实现,直接封装成函数方便复用:
build_desired_output <- function(Vector, index) { # 给每个索引匹配对应的符号:正号为"+",负号为"-" signs <- ifelse(index > 0, "+", "-") # 提取索引对应的元素 elements <- Vector[abs(index)] # 第一个元素如果是正号,去掉前置的"+"(符合目标输出格式) if (signs[1] == "+") { signs[1] <- "" } # 把符号和元素拼接,再用空格连起来 tagged_elements <- paste0(signs, elements) paste(tagged_elements, collapse = " ") } # 测试函数,得到目标结果 build_desired_output(Vector, index) # 输出:"beginner post2 - beginner baseline - advanced post2 + advanced baseline"
如果习惯用purrr这类函数式工具,也可以这样写:
library(purrr) library(stringr) build_desired_output <- function(Vector, index) { # 逐个匹配索引和元素,生成带符号的字符串 map2_chr(index, Vector[abs(index)], ~{ sign <- if (.x > 0) "+" else "-" paste0(sign, .y) }) %>% # 去掉第一个元素的前置"+" modify_at(1, ~str_remove(.x, "^\\+")) %>% # 拼接成最终字符串 paste(collapse = " ") }
这两种写法都能满足需求,核心逻辑都是先匹配符号,处理第一个元素的符号格式,最后拼接成目标字符串。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

