首页 > 解决方案 > 获取行名到列名,并将数据从行到同名的列放在一起

问题描述

我有一个这样的数据框:

X      ID    X1      X2      X3      X4      X5
BIL   1    1        2        7      1       5
Date 1    12.2     13.5     1.1     26.9    7.9
Year  1    2012    2013     2020    1999    2017
BIL   2    7        9       2        1      5
Date 2    12.2     13.5     1.1     26.9    7.9
Year  2   2022    2063     2000    1989    2015
BIL   3   1        2        7      1       5
Date 3   12.2     13.5     1.1     26.9    7.9
Year  3  2012    2013     2020    1999    2017

我想对其进行转换,以便获得一个新的 df,其中 BIL 日期年份作为列名,并在下面的行中列出值,例如

     ID  BIL   Date   Year
1     1    1     12.2    2012
2     1    2     13.5    2013
3     1    7
4     1    1
5     1    5
6     2    7    12.2     2022
7     2    9    13.5     2063

任何帮助将不胜感激!

编辑:有没有办法像我上面添加的那样添加分组变量

标签: rdataframe

解决方案


这个策略会奏效。

  • 通过将第一列名称与 X 等同来创建 ID 列。
  • 转换为长格式,使用names_to = NULL参数取消选择不需要的列(您的原始变量名称)
  • 转换回宽,这次使用正确的变量名
  • 使用参数将多个实例收集到list列中values_fn = listpivot_wider
  • 除了ID
df <- read.table(text = 'X      X1      X2      X3      X4      X5
BIL   1        2        7      1       5
Date 12.2     13.5     1.1     26.9    7.9
Year  2012    2013     2020    1999    2017
BIL   7        9       2        1      5
Date 12.2     13.5     1.1     26.9    7.9
Year  2022    2063     2000    1989    2015
BIL   1        2        7      1       5
Date 12.2     13.5     1.1     26.9    7.9
Year  2012    2013     2020    1999    2017', header = T)

library(tidyverse)

df %>% mutate(ID = cumsum(X == df[1,1])) %>%
  pivot_longer(!c(X,ID), names_to = NULL) %>%
  pivot_wider(id_cols = c(ID), names_from = X, values_from = value, values_fn = list) %>%
  unnest(!ID)
#> # A tibble: 15 x 4
#>       ID   BIL  Date  Year
#>    <int> <dbl> <dbl> <dbl>
#>  1     1     1  12.2  2012
#>  2     1     2  13.5  2013
#>  3     1     7   1.1  2020
#>  4     1     1  26.9  1999
#>  5     1     5   7.9  2017
#>  6     2     7  12.2  2022
#>  7     2     9  13.5  2063
#>  8     2     2   1.1  2000
#>  9     2     1  26.9  1989
#> 10     2     5   7.9  2015
#> 11     3     1  12.2  2012
#> 12     3     2  13.5  2013
#> 13     3     7   1.1  2020
#> 14     3     1  26.9  1999
#> 15     3     5   7.9  2017

reprex 包于 2021-05-17 创建 (v2.0.0 )

这也会给你同样的结果

df %>% mutate(ID = cumsum(X == df[1,1])) %>%
  pivot_longer(!c(X,ID)) %>%
  pivot_wider(id_cols = c(ID, name), names_from = X, values_from = value) %>%
  select(-name)

推荐阅读