如何根据R中的日期转置行和列?

How to transpose row and column according to date in R?

我无法根据日期和站点重组数据框。 目前我有这个:

 STATION    Latitude    Longitude   01/05/2007  01/06/2007  01/07/2007  01/08/2007  01/09/2007   
1001        X1           Y1         12,27       12,33       6,26        2,75        1,15         
1002        X2           Y2         12,14       5,99        3,51        2,98        1,92         
1003        X3           Y3         0           0           0           0           0

我想要这样的东西:

    Date        Station Latitude    Longtitude  Values
01/05/2007      1001    X1          Y1          12,27
01/06/2007      1001    X1          Y1          12,33
01/07/2007      1001    X1          Y1          6,26
01/08/2007      1001    X1          Y1          2,75
01/09/2007      1001    X1          Y1          1,15
01/05/2007      1002    X2          Y2          12,14
01/06/2007      1002    X2          Y2          5,99
01/07/2007      1002    X2          Y2          3,51
01/08/2007      1002    X2          Y2          2,98
01/09/2007      1002    X2          Y2          1,92
01/05/2007      1003    X3          Y3          0
01/06/2007      1003    X3          Y3          0
01/07/2007      1003    X3          Y3          0
01/08/2007      1003    X3          Y3          0
01/09/2007      1003    X3          Y3          0

谢谢!!!

编辑 貌似当列太多的时候,保持head正确是有问题的

DATA SET EXAMPLE

这个问题可能与 Reshaping data.frame from wide to long format 重复。

这是一个tidyverse解决方案。

library(dplyr)
library(tidyr)

df1 %>%
  pivot_longer(
    cols = 4:8,
    names_to = "Date",
    values_to = "Values"
  ) %>%
  relocate(Date, .before = STATION)

pivot_longer中,参数cols可以改为正则表达式匹配函数matches.

cols = matches("^\d+")

这是另一个解决方案:

 library(reshape2)
 dummy = data.frame('A'=c(1,2,3),'x'=c(1,2,3),'y'=c(1,2,3),
                    'date1'=c(5,6,7),
                     'date2'=c(8,9,0),'date3'=c(10,11,12))

我使用了这个汇总数据集。

    A x y   date1 date2 date3
  1 1 1 1     5     8    10
  2 2 2 2     6     9    11
  3 3 3 3     7     0    12

然后使用重塑:

 l = reshape(dummy,varying = setdiff(names(dummy),c('A','x','y')),
             times =setdiff(names(dummy),c('A','x','y'))  ,
             direction='long', v.names = "values")

这将是结果:

  A x y  time values id
  1 1 1 date1      5  1
  2 2 2 date1      6  2
  3 3 3 date1      7  3
  1 1 1 date2      8  1
  2 2 2 date2      9  2
  3 3 3 date2      0  3
  1 1 1 date3     10  1
  2 2 2 date3     11  2
  3 3 3 date3     12  3