1

我有一个 data.frame 像

   WWH        V1        V2        V3        Names
  2018-01-01 0.3240454 0.4044979 0.6208009     a
  2018-01-01 0.7240454 0.6044979 0.9208009     b
  2018-01-01 0.6124702 0.9391351 0.1459288     c
  2018-01-02 0.5754003 0.9088237 0.7105769     a
  2018-01-02 0.6947945 0.1100394 0.4810563     b
  2018-01-02 0.3207489 0.4254129 0.1989616     c

其中 Date-time 的分辨率是每天。我需要将日期时间的分辨率更改为半小时。所以基本上我需要将每一行重复 48 次,以使所有列保持一致,除了第一列将获得同一日期的半小时时间值

  WWH                 V1        V2        V3        Names
  2018-01-01   00:00:00     0.3240454 0.4044979 0.6208009     a
  2018-01-01   00:30:00     0.3240454 0.4044979 0.6208009     a
  2018-01-01   01:00:00     0.3240454 0.4044979 0.6208009     a

. . .

  2018-01-02   21:30:00     0.3207489 0.4254129 0.1989616     c
  2018-01-02   22:00:00     0.3207489 0.4254129 0.1989616     c
  2018-01-02   22:30:00     0.3207489 0.4254129 0.1989616     c
  2018-01-02   23:00:00     0.3207489 0.4254129 0.1989616     c
  2018-01-02   23:30:00     0.3207489 0.4254129 0.1989616     c

这是可重现的代码

WWH<-seq(as.POSIXlt("2018/1/1"), as.POSIXlt("2018/1/5"), "days")
Names<-c("a","b","c","d","e")
A1<- cbind("Date"=rep(WWH[1],5),as.data.frame(matrix(runif(15),5,3)),"Names"=Names)
A2<-cbind("Date"=rep(WWH[2],3),as.data.frame(matrix(runif(9),3,3)),"Names"=Names[1:3])
A3<-cbind("Date"=rep(WWH[3],2),as.data.frame(matrix(runif(2),2,3)),"Names"=Names[4:5])
df<-rbind(A1,A2,A3)
4

1 回答 1

1

这是使用rep()和的两个步骤的解决方案seq()

数据:

WWH<-seq(as.POSIXlt("2018/1/1"), as.POSIXlt("2018/1/5"), "days")
Names<-c("a","e","r","c","u")
df <- cbind(WWH,as.data.frame(matrix(runif(15),5,3)),Names)

首先,我们将数据帧的所有行克隆 48 次,占 48 个半小时。

df.exp <- df[rep(row.names(df), each = 48), ]

然后我们替换WWH为一个半小时的序列,从第一天开始,到最后一天的 23:30 结束:

df.exp$WWH <- seq(
  from=df$WWH[1],
  to=df$WWH[nrow(df)] + 84600,
  by=1800
)

结果:

> head(df.exp)
                    WWH       V1         V2        V3 Names
1   2018-01-01 00:00:00 0.639078 0.01123183 0.4661781     a
1.1 2018-01-01 00:30:00 0.639078 0.01123183 0.4661781     a
1.2 2018-01-01 01:00:00 0.639078 0.01123183 0.4661781     a
1.3 2018-01-01 01:30:00 0.639078 0.01123183 0.4661781     a
1.4 2018-01-01 02:00:00 0.639078 0.01123183 0.4661781     a
1.5 2018-01-01 02:30:00 0.639078 0.01123183 0.4661781     a

> tail(df.exp)
                     WWH        V1        V2        V3 Names
5.42 2018-01-05 21:00:00 0.1457907 0.5508916 0.7658603     u
5.43 2018-01-05 21:30:00 0.1457907 0.5508916 0.7658603     u
5.44 2018-01-05 22:00:00 0.1457907 0.5508916 0.7658603     u
5.45 2018-01-05 22:30:00 0.1457907 0.5508916 0.7658603     u
5.46 2018-01-05 23:00:00 0.1457907 0.5508916 0.7658603     u
5.47 2018-01-05 23:30:00 0.1457907 0.5508916 0.7658603     u

参考书目:

复制data.frame的每一行,并指定每一行的复制次数

以 30 分钟为间隔创建时间序列

如何从日期减去/添加天数?


编辑:这是一个用于创建分组变量的dplyr版本:interaction

WWH<-seq(as.POSIXlt("2018/1/1"), as.POSIXlt("2018/1/5"), "days")
Names<-c("a","b","c","d","e")
A1<- cbind("Date"=rep(WWH[1],5),as.data.frame(matrix(runif(15),5,3)),"Names"=Names)
A2<-cbind("Date"=rep(WWH[2],3),as.data.frame(matrix(runif(9),3,3)),"Names"=Names[1:3])
A3<-cbind("Date"=rep(WWH[3],2),as.data.frame(matrix(runif(2),2,3)),"Names"=Names[4:5])
df<-rbind(A1,A2,A3)

df.exp <- df[rep(row.names(df), each = 48), ]

  df.exp <- df.exp %>%
  mutate(temp = droplevels(interaction(df.exp$Date, df.exp$Names))) %>%
  group_by(temp) %>%
  mutate(Datetime = seq(
    from = unique(Date),
    to = unique(Date) + 84600,
    by = 1800
  )) %>%
  ungroup() %>%
  select(-(temp))

tail(df.exp)

# A tibble: 6 x 6
        Date        V1        V2        V3  Names            Datetime
      <dttm>     <dbl>     <dbl>     <dbl> <fctr>              <dttm>
1 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 21:00:00
2 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 21:30:00
3 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 22:00:00
4 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 22:30:00
5 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 23:00:00
6 2018-01-03 0.4327316 0.4327316 0.4327316      e 2018-01-03 23:30:00
于 2018-08-06T08:13:49.043 回答