如何在R语言中展开数据框的向量列(含Code Range列示例)?
这两个问题其实可以用tidyverse工具包(tidyr + dplyr)一站式解决,我给你一步步拆解,先从你给出的具体场景入手,再延伸到通用的向量列展开方法。
首先,我们先构造一个和你描述一致的示例数据框,方便演示:
library(tidyverse) df <- tibble( Code_Range = c("61000:61055", "0356T:0358T", "S9090:S9090"), Label = c("Test1", "Test2", "Test3") )
接下来核心是处理Code_Range列的范围展开,这里需要注意两种情况:纯数字范围、带字母前缀的代码范围,还要保证前导零不丢失(比如0356T的四位数字格式)。我写一个通用的函数来处理这些情况:
expand_code_range <- function(range_str) { # 拆分范围的起始和结束值 parts <- str_split(range_str, ":")[[1]] start_code <- parts[1] end_code <- parts[2] # 如果起始和结束相同,直接返回原代码 if (start_code == end_code) { return(start_code) } # 提取代码的字母前缀和数字部分 prefix <- str_extract(start_code, "^[A-Za-z]+") start_num <- as.numeric(str_extract(start_code, "\\d+$")) end_num <- as.numeric(str_extract(end_code, "\\d+$")) # 生成数字序列,补前导零保证位数一致 num_sequence <- seq(start_num, end_num, by = 1) formatted_nums <- str_pad(num_sequence, width = nchar(str_extract(start_code, "\\d+$")), pad = "0") # 拼接前缀和数字,得到完整代码 paste0(prefix, formatted_nums) }
有了这个函数,我们就可以用map把每个Code_Range转成展开后的代码向量,再用unnest把向量列拆成多行,同时保留对应的Label:
df_expanded <- df %>% mutate(Codes = map(Code_Range, expand_code_range)) %>% unnest(Codes)
运行完之后,你就能得到想要的结果:每个单独的代码都和对应的Label关联,比如61000到61055每一行都是Test1,S9090单独一行对应Test3。
然后回到你第一个问题:如何展开数据框中包含向量的列?
其实刚才用到的unnest就是tidyverse里最常用的方法,如果你的向量列是列表格式(比如上面用map生成的Codes列),直接用unnest(列名)就能把每个向量元素拆成单独的行,同时保留其他列的信息。如果是用base R的话,也可以用do.call(rbind, lapply(...))的方式,但tidyverse的写法更直观易读。
另外补充一下,如果你的R版本比较新(tidyr 1.0.0+),也可以用unnest_longer(Codes)来完成展开,效果是一样的。
内容的提问来源于stack exchange,提问作者TOTX
相关产品推荐
相关产品推荐

