You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存在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/c
  • values_from:指定需要从长格式转成宽格式的变量列,这里同时处理var1和var2
  • names_sep:设置变量名与后缀之间的分隔符,确保生成的列名符合var1_a的格式要求

内容的提问来源于stack exchange,提问作者Victor Shin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:30:59