存在3个标识符时,如何将长格式DataFrame转换为宽格式?
问题描述
我有一个包含3个标识符和多个变量的DataFrame,示例数据包含country(国家)、person(人员)、time(时间)三个标识符,以及var1、var2两个变量,数据构造代码如下:
set.seed(123) df1 <- data.frame(country = LETTERS[1:2]) df2 <- data.frame(person = letters[1:3]) df3 <- data.frame(time = 1:3) df <- merge(df1, df2) df <- merge(df, df3) df <- df %>% mutate(var1 = runif(18), var2 = runif(18)) df <- df %>% arrange(country, person, time)
生成的DataFrame结构如下:
country person time var1 var2 1 A a 1 0.28757752 0.32792072 2 A a 2 0.52810549 0.65570580 3 A a 3 0.67757064 0.96302423 4 A b 1 0.40897692 0.88953932 5 A b 2 0.55143501 0.54406602 6 A b 3 0.10292468 0.69070528 7 A c 1 0.94046728 0.64050681 8 A c 2 0.95683335 0.28915974 9 A c 3 0.24608773 0.02461368 10 B a 1 0.78830514 0.95450365 11 B a 2 0.89241904 0.70853047 12 B a 3 0.57263340 0.90229905 13 B b 1 0.88301740 0.69280341 14 B b 2 0.45661474 0.59414202 15 B b 3 0.89982497 0.79546742 16 B c 1 0.04555650 0.99426978 17 B c 2 0.45333416 0.14711365 18 B c 3 0.04205953 0.47779597
希望将该数据集转换为每行对应country×time的宽格式,生成var1_a、var1_b、var1_c、var2_a、var2_b、var2_c共6列,请问最优实现方法是什么?
最优实现方法
使用tidyverse工具包中的pivot_wider()函数是最简洁高效的方案,它专门针对长格式转宽格式的需求设计,支持多变量同时转换,代码可读性强且执行效率高。
实现代码
library(tidyverse) wide_df <- df %>% pivot_wider( id_cols = c(country, time), # 指定行的唯一标识列 names_from = person, # 用该列的取值生成新列名后缀 values_from = c(var1, var2), # 需要转换为宽格式的变量列 names_sep = "_" # 设置变量名与后缀的分隔符 )
转换结果
运行代码后得到的宽格式数据如下:
# A tibble: 6 × 8 country time var1_a var1_b var1_c var2_a var2_b var2_c <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 A 1 0.288 0.409 0.940 0.328 0.890 0.641 2 A 2 0.528 0.551 0.957 0.656 0.544 0.289 3 A 3 0.678 0.103 0.246 0.963 0.691 0.0246 4 B 1 0.788 0.883 0.0456 0.955 0.693 0.994 5 B 2 0.892 0.457 0.453 0.709 0.594 0.147 6 B 3 0.573 0.900 0.0421 0.902 0.795 0.478
参数说明
id_cols:定义哪些列作为行的唯一标识,这里设置为country和time,正好对应每行country×time的需求names_from:指定用哪一列的取值来扩展新列名的后缀,这里是person列的a/b/cvalues_from:指定需要从长格式转成宽格式的变量列,这里同时处理var1和var2names_sep:设置变量名与后缀之间的分隔符,确保生成的列名符合var1_a的格式要求
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

