R语言:将宽格式数据框按指定列拆分转换为长格式
宽格式数据框转长格式(拆分hits列)
方法一:用tidyverse的tidyr包(最简洁)
这是最直观简便的实现方式,利用separate_rows函数直接拆分列并展成长格式:
# 安装并加载tidyverse(若未安装) install.packages("tidyverse") library(tidyverse) # 定义原数据框 mydf <- data.frame( pattern = c('aa','ab','bc','de'), code = c('code1','code2','code3','code4'), hits = c('aa1,aa3,aa5','ab27,ab86','','de4') ) # 转换长格式:拆分hits列,过滤空值,重命名列 mydf2 <- mydf %>% separate_rows(hits, sep = ",") %>% filter(hits != "") %>% rename(hit = hits) # 输出结果 mydf2
运行后得到的结果与需求完全一致:
hit pattern code 1 aa1 aa code1 2 aa3 aa code1 3 aa5 aa code1 4 ab27 ab code2 5 ab86 ab code2 6 de4 de code4
方法二:基础R实现(无需额外包)
如果不想依赖第三方包,可通过字符串拆分、索引复制来实现:
# 定义原数据框 mydf <- data.frame( pattern = c('aa','ab','bc','de'), code = c('code1','code2','code3','code4'), hits = c('aa1,aa3,aa5','ab27,ab86','','de4') ) # 拆分hits列并过滤空元素 split_hits <- strsplit(mydf$hits, ",") split_hits <- lapply(split_hits, function(x) x[x != ""]) # 生成对应原行的索引 row_indices <- rep(seq(nrow(mydf)), sapply(split_hits, length)) # 构造结果数据框 mydf2 <- data.frame( hit = unlist(split_hits), pattern = mydf$pattern[row_indices], code = mydf$code[row_indices] ) # 输出结果 mydf2
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

