如何高效处理数据框案例与变量:长表转宽表需求
高效实现重复案例合并与列展开(R语言)
我正在学习数据整理(data wrangling),当前处理一个包含6422条观测、20个变量的数据框(data frame)。遇到的问题是:存在多列(如示例中的x1、x2、x3、x4)案例重复的情况,希望将重复案例合并为一行,同时将对应的value1、value2列按stats.title字段展开为新列,目标是将df1转换为df7格式。
我已尝试手动拆分合并的方法,但因数据量较大,现寻求高效的实现方式。
示例数据生成代码
library(dplyr) library(tidyr) x1 <- rep(c("A","E"), each=3) x2 <- rep(c("B","F"), each=3) x3 <- rep(c("C","G"), each=3) x4 <- rep(c("D","H"), each=3) stats.title <- rep(c("I","J","K"), times=2) value1 <- (1:6) value2 <- (7:12) df1 <- data.frame(x1,x2,x3,x4,stats.title,value1,value2)
df1的结构如下:
x1 x2 x3 x4 stats.title value1 value2 1 A B C D I 1 7 2 A B C D J 2 8 3 A B C D K 3 9 4 E F G H I 4 10 5 E F G H J 5 11 6 E F G H K 6 12
高效转换方案
无需手动拆分合并,直接使用tidyr的pivot_wider函数,通过指定分组列、列名来源和数值列,一步完成转换:
df7 <- df1 %>% pivot_wider( id_cols = c(x1, x2, x3, x4), # 按这些列分组,合并重复案例 names_from = stats.title, # 以该字段值作为新列名的后缀 values_from = c(value1, value2) # 需要展开为新列的数值字段 )
转换后的df7结构:
x1 x2 x3 x4 value1_I value1_J value1_K value2_I value2_J value2_K <chr> <chr> <chr> <chr> <int> <int> <int> <int> <int> <int> 1 A B C D 1 2 3 7 8 9 2 E F G H 4 5 6 10 11 12
方案说明
id_cols参数指定用于分组的列(即重复的案例标识列),函数会自动将这些列值相同的行合并为一行names_from指定用于生成新列名后缀的字段values_from指定需要按names_from字段展开的数值列,函数会自动将每个分组内的对应值填充到新列中
这种方法避免了手动拆分、合并数据框的繁琐操作,处理大数量级数据时效率更高,代码可读性也更强。
内容的提问来源于stack exchange,提问作者rhay
相关产品推荐
相关产品推荐

