如何将含范围的R向量解析为对应行的列表?
问题:解析字母范围格式的字符串为对应序列
输入定义
input_string <- as.vector(c("S0027A-E", "S0028A-D", "S0029A-C"))
期望输出
需要得到与输入每个值对应的解析结果,格式如下:
| input_string | parsed_strings |
|---|---|
| "S0027A-E" | "S0027A", "S0027B", "S0027C", "S0027D", "S0027E" |
| "S0028A-D" | "S0028A", "S0028B", "S0028C", "S0028D" |
| "S0029A-C" | "S0029A", "S0029B", "S0029C" |
现有代码问题
现有代码将所有解析结果合并成了一个包含12个元素的单一向量,而非每个输入对应一个子向量的列表:
# length of input_string len_string = length(input_string) # Extract the prefix, start, and end letters library(stringr) parsed_strings <- as.character() for (i in 1:len_string){ prefix <- str_extract(input_string[[i]][1], "^[A-Z]\\d{4}") range_part <- str_extract(input_string[[i]][1], "[A-Z]-[A-Z]$") start_letter <- substr(range_part, 1, 1) end_letter <- substr(range_part, 3, 3) output <- paste0(prefix, LETTERS[match(start_letter, LETTERS):match(end_letter, LETTERS)]) parsed_strings <- c(parsed_strings, output) }
修正后的代码
核心修改是将parsed_strings初始化为列表,而非字符向量,每次循环将当前输入的解析结果作为列表元素添加:
library(stringr) input_string <- as.vector(c("S0027A-E", "S0028A-D", "S0029A-C")) len_string <- length(input_string) # 初始化为空列表,而非字符向量 parsed_strings <- list() for (i in 1:len_string){ # 简化索引,直接用input_string[i]即可 current_str <- input_string[i] prefix <- str_extract(current_str, "^[A-Z]\\d{4}") range_part <- str_extract(current_str, "[A-Z]-[A-Z]$") start_letter <- substr(range_part, 1, 1) end_letter <- substr(range_part, 3, 3) output <- paste0(prefix, LETTERS[match(start_letter, LETTERS):match(end_letter, LETTERS)]) # 将当前结果添加为列表的第i个元素 parsed_strings[[i]] <- output } # 查看结果 parsed_strings
修正后结果
运行代码后,parsed_strings是长度为3的列表,每个元素对应输入的解析序列:
parsed_strings[[1]]:"S0027A" "S0027B" "S0027C" "S0027D" "S0027E"parsed_strings[[2]]:"S0028A" "S0028B" "S0028C" "S0028D"parsed_strings[[3]]:"S0029A" "S0029B" "S0029C"
如果需要生成与输入对应的结构化数据框,可以进一步转换:
result_df <- data.frame( input_string = input_string, parsed_strings = I(parsed_strings) # I()保留列表列格式 ) print(result_df)
内容的提问来源于stack exchange,提问作者Wilfredo de Vera
相关产品推荐
相关产品推荐

