R语言如何提取数据框内各粒度级首个值生成新简化数据框
R语言仪器原始数据批量提取方案
核心实现逻辑
你需要提取的是每个分号分隔的粒度级块中,逗号拆分后的第2个值,以下两种方案均可自动适配最多上万个粒度级的场景,无需手动筛选列。
方案1:tidyverse 透明处理方案(推荐,便于校验数据)
依赖dplyr和tidyr包,拆分过程可追溯,兼容异常格式(比如多余的分号、逗号):
library(tidyverse) df_result <- df %>% # 按分号拆分data列,每个粒度级单独成一行,旧版tidyr可替换为 separate_rows(data, sep = ";") separate_longer_delim(data, delim = ";") %>% # 过滤空行(处理末尾多余分号导致的空粒度级) filter(data != "") %>% # 按逗号拆分粒度级内容,依次为粒度编号、第1/2/3个测量值,自动兼容多余逗号 separate_wider_delim(data, delim = ",", names = c("size_class", "val1", "val2", "val3"), too_few = "align_start") %>% # 仅保留所需字段 select(date, size_class, val1) %>% # 转换为宽格式,自动生成对应粒度级的列 pivot_wider(names_from = size_class, values_from = val1, names_prefix = "data_sizeclass_")
方案2:正则提取高效方案(适合大数据量场景)
依赖stringr,运行速度快,适合数据质量较高的场景:
library(stringr) library(dplyr) # 计算最大粒度级数量 max_sizeclass <- max(str_count(df$data, ";")) + 1 # 批量提取所有粒度级的第一个测量值 for (i in 1:max_sizeclass) { df <- df %>% mutate(!!paste0("data_sizeclass_", i) := str_extract(data, paste0("(?<=", i, ",)[^,]+"))) } # 删除原始data列得到最终结果 df_result <- df %>% select(-data)
内容的提问来源于stack exchange,提问作者Uli Starfish
相关产品推荐
相关产品推荐

