按组展开数据框

问题描述

我有一个包含 1000 个数据帧 (500x500) 的大数据框,我通过以下代码创建:

setwd("user/all_csv")
archivos <- list.files(full.names = F)
big.df <- lapply(archivos,read.csv,header = TRUE) %>%
       set_names(archivos)%>%
       bind_rows(.id = 'grp')

big.df 如下所示(一个小例子):

grp           X    X1     X2     X5
2020_01_19    1    23     47     3
2020_01_19    2    13     45     54
2020_01_19    5    23     41     21
2020_01_20    1    65     32     19
2020_01_20    2    39     52     12
2020_01_20    5    43     76     90
...

如何生成以下输出?:

             1-X1   1-X2   1-X5    2-X1    2-X2    2-X5    5-X1    5-X2    5-X5
2020_01_19    23     47     3       13      45      54      23      41      21
2020_01_20    65     32     19      39      52      12      43      76      90
...

我真的不知道如何继续。任何帮助将不胜感激。

解决方法

使用 tidyr::pivot_widernames_glue 参数如下。

  • 存储所有变量(甚至 500 个)的名称,以将其转换为向量,例如 cols
  • values_from = all_of(cols) 中使用 pivot_wider 作为参数
cols <- c('X1','X2','X5')
df %>% pivot_wider(id_cols = grp,names_from = X,values_from = all_of(cols),names_glue = '{X}-{.value}')

# A tibble: 2 x 10
  grp        `1-X1` `2-X1` `5-X1` `1-X2` `2-X2` `5-X2` `1-X5` `2-X5` `5-X5`
  <chr>       <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
1 2020_01_19     23     13     23     47     45     41      3     54     21
2 2020_01_20     65     39     43     32     52     76     19     12     90

如果要使用除前两列之外的所有列,请使用此

df %>% pivot_wider(id_cols = grp,values_from = !c(grp,X),names_glue = '{X}-{.value}')

# A tibble: 2 x 10
  grp        `1-X1` `2-X1` `5-X1` `1-X2` `2-X2` `5-X2` `1-X5` `2-X5` `5-X5`
  <chr>       <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>  <int>
1 2020_01_19     23     13     23     47     45     41      3     54     21
2 2020_01_20     65     39     43     32     52     76     19     12     90

但是,如果您想按照预期结果重新排列列,您仍然需要做一些解决方法,可能就像 this 作为 issue 839 一样,这仍然打开。