【问题标题】:Expand a data frame by group按组展开数据框
【发布时间】:2021-04-27 08:03:13
【问题描述】:

我有一个由 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
...

我真的不知道该怎么做。任何帮助将不胜感激。

【问题讨论】:

    标签: r dataframe reshape2


    【解决方案1】:

    使用tidyr::pivot_widernames_glue 参数,如下所示。

    • 存储所有变量(甚至是 500)的名称,以将其转换为向量,例如 cols
    • pivot_wider 中使用values_from = all_of(cols) 作为参数
    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, names_from = X, 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
    

    但是,如果您想按照预期结果重新排列列,可以在tidyr 1.2.0pivot_wider 函数中使用names_vary = 'slowest'

    【讨论】:

    • 我收到此错误:pivot_wider(., id_cols = grp, names_from = X, values_from = colnames(my2), 中的错误:未使用的参数 (names_glue = "{X}-{.value }")
    • 另外,我如何将它概括为 500 个变量?
    • 对不起,我认为它有效,但我收到了那个错误:Error in pivot_wider(., id_cols = grp, names_from = X, values_from = all_of(cols), : unused argument (names_glue = "{X}-{.value}")
    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多