有没有办法采用以列为时间,行作为日期的数据帧并将日期/时间组合为向量的方法?

我的数据集是特定监视站点的污染物浓度,其中行名称是观察日期,列名称是观察时间。即数据是一个n x 25矩阵,其中每一列对应一个小时的时间段,每一行代表给定日期的所有测量值。

请参见以下示例:

Day          0:00-1:00    1:00-2:00    2:00-3:00    3:00-4:00   4:00-5:00   5:00-6:00    ...
01/20/2019   0.045        0.258        0.335        0.347       0.255       0.198
01/21/2019   0.058        0.125        0.187        0.177       0.278       0.389
.
.
.

(请注意,实际数据将有25列来说明所有24小时)

我正在尝试对此数据进行一些时间序列分析,据我所知,基本ts()函数未配备处理这种格式的数据的功能,因为它会将每一列都解释为一个单独的时间序列

有没有一种方法可以压缩此数据,使得每个值仅具有一个具有日期和时间的相应行名称,即

Date/Time:               Concentration
01/20/2019-0:00-1:00     0.045
01/20/2019-1:00-2:00     0.258

我已经尝试过简单地使用tidyr,特别是“ gather”和“ unite”功能,但是没有成功。

有没有一种方法可以轻松地压缩此数据帧或另一种方法来分析此数据?

steven35 回答:有没有办法采用以列为时间,行作为日期的数据帧并将日期/时间组合为向量的方法?

gather函数位于正确的位置,实际上您需要unite而不是separate。您可能还需要lubridate包中的内容来转换日期和时间。 (gather的语法对于人们来说可能很奇怪,如果发现更简单,新的pivot_longer函数将执行相同的工作。)

library(tidyverse)
library(lubridate)
df %>%
  mutate(Day = mdy(Day)) %>%
  gather(key = "time_block",value = "Concentration",-Day) %>%
  separate(time_block,into = c("from","to"),sep = "-",remove = FALSE) %>%
  # Hopefully times are on a 24-hour clock,else you have more work to do
  mutate(timestamp_string = paste0(as.character(Day)," ",from)) %>%
  mutate(timestamp_dt = ymd_hm(timestamp_string))

输出最终看起来像这样。

         Day time_block from   to Concentration timestamp_string        timestamp_dt
1  2019-01-20  0:00-1:00 0:00 1:00         0.045  2019-01-20 0:00 2019-01-20 00:00:00
2  2019-01-21  0:00-1:00 0:00 1:00         0.058  2019-01-21 0:00 2019-01-21 00:00:00
3  2019-01-20  1:00-2:00 1:00 2:00         0.258  2019-01-20 1:00 2019-01-20 01:00:00
4  2019-01-21  1:00-2:00 1:00 2:00         0.125  2019-01-21 1:00 2019-01-21 01:00:00
,

您也可以使用pivot_longer

library(tidyverse)
df %>% 
 pivot_longer(-Day,names_to = "time",values_to = "value") %>% 
  mutate(day_time = lubridate::mdy_hm(paste(Day,sub("X","",time))))

如果您的数据格式如下:

df <-data.frame(
  Day = c("01/20/2019","01/21/2019"),`0:00` = c(0.045,0.058),`1:00` = c(0.258,0.125),`2:00` = c(0.335,0.187),`3:00` = c(0.347,0.177),`4:00` = c(0.255,0.275),`5:00` = c(0.198,0.389)) 
,

您可以尝试(未运行代码)

library(reshape)
yournewdata<-melt(data=yourdata,id.vars=Day)

时间:在您的示例中,您的时间没有以与R日期格式兼容的格式给出。 (R中没有时间范围)。因此,您的数据应转换为小时。我可以通过在执行融化操作之前重命名列来实现。

colnames(mydata)

在将它们转换为时间值之前,应将它们从因子更改为数值。

本文链接:https://www.f2er.com/3097810.html

大家都在问