R语言如何将多组并列Euros、N列的数据表重构为按指标分行格式
R 重复配对列的表格重构实现
原始数据形态
待处理的R数据表存在多组固定配对的重复列,每组列由Euros和N构成并排排布,示例结构如下:
ID Euros N Euros N Euros N 1 A 133.911,20 451 134.208,78 450 442,03 328 2 C 9.470,35 2856 26,18 2721 26,28 2699
目标输出结构
需要将横向并排的多组Euros、N列,转换为每个ID对应两行的结构:一行存放该ID下所有Euros列的数值,一行存放所有N列的数值,最终输出如下:
ID Var1 Var2 Var3 Var4 1 A Euros 133.911,20 134.208,78 442,03 2 A N 451 450 328 3 C Euros 9.470,35 26,18 26,28 4 C N 2856 2721 2699
原有操作的问题
之前尝试通过spread(mydatatable, Euros, N)转换得到错误结果,核心原因:
- 函数
spread的作用是将长表转为宽表,和当前需要的「宽表转指定结构长表」的处理方向完全相反 - 原始数据存在重复列名,没有提前标记列的配对关系,直接调用重塑函数会把
Euros列的数值识别为新列名,打乱原有数据结构,最终只得到单ID单值的错位结果
正确实现流程
步骤1:给重复列添加分组标识
原始表存在3组并列的Euros、N列,直接重命名列名,把配对关系用序号标记清楚,避免列名重复导致的操作混乱。
library(dplyr) library(tidyr) # 为重复列添加序号标识 colnames(mydatatable) <- c("ID", "Euros_1", "N_1", "Euros_2", "N_2", "Euros_3", "N_3")
步骤2:分模块提取数据拼接
分别提取所有和Euros、N相关的列,添加对应的类型标记列,最后按行拼接为目标结构。
# 提取所有Euros列的数据,补充类型标记 euros_part <- mydatatable %>% select(ID, starts_with("Euros")) %>% mutate(Var1 = "Euros") %>% rename(Var2 = Euros_1, Var3 = Euros_2, Var4 = Euros_3) # 提取所有N列的数据,补充类型标记 n_part <- mydatatable %>% select(ID, starts_with("N")) %>% mutate(Var1 = "N") %>% rename(Var2 = N_1, Var3 = N_2, Var4 = N_3) # 按ID顺序拼接两部分数据 result <- bind_rows(euros_part, n_part) %>% arrange(ID, desc(Var1))
结果校验
运行上述代码得到的result数据框,列结构和数值排布完全匹配目标输出,不需要额外调整。
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

