如何在R中按字符标识拆分长格式数据框
拆分堆叠长格式数据为独立数据框
问题背景
现有长格式数据由多个结构相似的数据框堆叠而成,需以Buy curve和Sell curve作为数据块的起始标识,将原数据拆分为独立的数据框,同时保留列名用于后续转宽格式处理。原代码仅能提取Sell curve对应的数据块,无法保留Buy curve部分。
示例数据
Columns <- c("Buy curve", "Price value", "Volume value", "Price value", "Volume value","Price value", "Volume value", "Sell curve", "Price value", "Volume value", "Price value", "Volume value","Price value", "Volume value") Values <- c(NA, 0, 10, 3, 4, 5, 0, NA, 0, 0, 1, 2, 4, 8) df1 <- data.frame(Columns, Values)
原数据结构:
Columns Values 1 Buy curve NA 2 Price value 0 3 Volume value 10 4 Price value 3 5 Volume value 4 6 Price value 5 7 Volume value 0 8 Sell curve NA 9 Price value 0 10 Volume value 0 11 Price value 1 12 Volume value 2 13 Price value 4 14 Volume value 8
解决方案
使用dplyr和tidyr工具包实现自动识别标识、拆分数据块,并直接转换为宽格式:
library(dplyr) library(tidyr) # 1. 为每个数据块生成唯一分组ID df_grouped <- df1 %>% mutate(group_id = cumsum(Columns %in% c("Buy curve", "Sell curve"))) # 2. 拆分数据块并处理为宽格式 split_dfs <- split(df_grouped, df_grouped$group_id) %>% lapply(function(block) { # 获取当前数据块的名称(即起始标识) block_name <- block$Columns[is.na(block$Values)] # 移除起始标识行 cleaned_block <- block %>% filter(!Columns %in% c("Buy curve", "Sell curve")) # 为每组Price/Volume添加行序号,用于转宽格式 numbered_block <- cleaned_block %>% group_by(Columns) %>% mutate(row_num = row_number()) %>% ungroup() # 转换为宽格式并移除辅助列 wide_block <- numbered_block %>% pivot_wider(names_from = Columns, values_from = Values) %>% select(-row_num) # 将处理好的数据框存入全局环境,命名为标识名称 assign(block_name, wide_block, envir = .GlobalEnv) return(wide_block) })
结果说明
执行后,全局环境中会生成两个独立的数据框:
Buy curve:对应原数据中第一块的宽格式数据
Price value Volume value 1 0 10 2 3 4 3 5 0
Sell curve:对应原数据中第二块的宽格式数据
Price value Volume value 1 0 0 2 1 2 3 4 8
内容的提问来源于stack exchange,提问作者KjetilH
相关产品推荐
相关产品推荐

