如何根据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正确是有问题的
这个问题可能与 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
我无法根据日期和站点重组数据框。 目前我有这个:
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正确是有问题的
这个问题可能与 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