R语言按单列融合DataFrame 堆叠相同命名模式的其余列
R语言数据重塑解决方案
方案1:tidyverse 实现(可读性高,易维护)
该方案依赖tidyr包的长宽转换函数,自动适配列名规则,不需要手动指定列位置:
library(tidyverse) df_reshape <- df %>% # 按列名的点分隔符拆分,直接提取后缀为列名 pivot_longer(cols = -Year, names_to = c("prefix", ".value"), names_sep = "\\.") %>% # 去除不需要的前缀列(A/B/C) select(-prefix) # 验证结果是否和目标一致 identical(df_reshape, df_goal)
方案2:基础R实现(无依赖,处理大数据速度更快)
如果你的数据体量极大,不需要加载第三方包可以用基础R实现,逻辑是批量提取相同后缀的列合并:
# 提取所有后缀名(自动识别x/y/z,无需手动指定) suffix <- unique(gsub("^.*\\.", "", names(df)[names(df) != "Year"])) # 提取所有前缀名(自动识别A/B/C分组数量) prefix <- unique(gsub("\\..*$", "", names(df)[names(df) != "Year"])) # 批量生成每一列的数值 df_list <- lapply(suffix, function(s) { as.vector(t(df[, grepl(paste0("\\.", s, "$"), names(df))])) }) names(df_list) <- suffix # 生成Year列 df_list$Year <- rep(df$Year, each = length(prefix)) # 调整列顺序得到最终结果 df_reshape <- as.data.frame(df_list)[, c("Year", suffix)] # 验证结果是否和目标一致 identical(df_reshape, df_goal)
说明
两种方案都完全适配你的命名规则,无论前缀(A/B/C)和后缀(x/y/z)的数量有多少,都可以自动识别处理,不需要手动调整列索引,适合大规模数据集的自动化处理。
内容的提问来源于stack exchange,提问作者Theodore
相关产品推荐
相关产品推荐

