【问题标题】:How to convert a data frame from wide to long with multiple columns [duplicate]如何将具有多列的数据框从宽转换为长[重复]
【发布时间】:2023-09-15 23:15:01
【问题描述】:

我有一个这样的数据框,它是使用“reshape”函数生成的。我想知道 reshape 函数是否有一个“相反”功能,它允许我根据多列将数据框从宽变为长?

我有这个:

ID     Date.1       Site.1     Brand.1   Date.2      Site.2   Brand.2
A-001  2021-05-21   Place A    Brand A   2021-06-01  Place B  Brand C 
A-002  2021-05-19   Place D    Brand A   2021-05-19  Place D  Brand D

但是想要这样:

ID    Seq   Date        Site     Brand
A-001 1     2021-05-21  Place A  Brand A
A-001 2     2021-06-01  Place B  Brand C
A-002 1     2021-05-19  Place D  Brand A
A-002 2     2021-05-19  Place D  Brand D

谢谢!

【问题讨论】:

    标签: r reshape reshape2


    【解决方案1】:

    我们可以使用pivot_longer

    library(tdyr)
    pivot_longer(df1, cols = -ID, names_to = c(".value", "Seq"), names_sep = "\\.")
    

    -输出

    # A tibble: 4 x 5
    #  ID    Seq   Date       Site    Brand  
    #  <chr> <chr> <chr>      <chr>   <chr>  
    #1 A-001 1     2021-05-21 Place A Brand A
    #2 A-001 2     2021-06-01 Place B Brand C
    #3 A-002 1     2021-05-19 Place D Brand A
    #4 A-002 2     2021-05-19 Place D Brand D
    

    或者使用来自base Rreshape

    reshape(df1, direction = 'long', varying = list(c(2, 5), c(3, 6), c(4, 7)))
    

    数据

    df1 <- structure(list(ID = c("A-001", "A-002"), Date.1 = c("2021-05-21", 
    "2021-05-19"), Site.1 = c("Place A", "Place D"), Brand.1 = c("Brand A", 
    "Brand A"), Date.2 = c("2021-06-01", "2021-05-19"), Site.2 = c("Place B", 
    "Place D"), Brand.2 = c("Brand C", "Brand D")), class = "data.frame", 
         row.names = c(NA, 
    -2L))
    

    【讨论】: