You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:41:03