我该如何重塑这个 table?

How do I reshape this table?

我有一个如下所示的数据框:

Date       Species 00:00 02:00 04:00 06:00 08:00 10:00 12:00 14:00 16:00 18:00 20:00 22:00
01.05.2019 A       0     0     0     0     0     2     5     8     0     0     0     0
02.05.2019 A       0     0     0     8     0     4     3     0     0     0     0     0

这些数字是在 2 小时的持续时间内记录的双小时值,例如凌晨 0 点到凌晨 2 点之间。

对于我想要使用的 R 包,table 需要如下所示:

Species  from              to                value 
A        01.05.2019 00:00  01.05.2019 02:00  0
A        01.05.2019 02:00  01.05.2019 04:00  0  
A        01.05.2019 04:00  01.05.2019 06:00  0  
A        01.05.2019 06:00  01.05.2019 08:00  0  
A        01.05.2019 08:00  01.05.2019 10:00  0  
A        01.05.2019 10:00  01.05.2019 12:00  2 
A        01.05.2019 12:00  01.05.2019 14:00  5 
A        01.05.2019 14:00  01.05.2019 16:00  8
A        01.05.2019 16:00  01.05.2019 18:00  0  
A        01.05.2019 18:00  01.05.2019 20:00  0  
A        01.05.2019 20:00  01.05.2019 22:00  0  
A        01.05.2019 22:00  02.05.2019 00:00  0  
A        02.05.2019 00:00  01.05.2019 02:00  0    
A        02.05.2019 02:00  01.05.2019 04:00  0   

或许,你可以试试:

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(cols = -(1:2), names_to = 'From') %>%
  unite(From, Date, From, sep = " ") %>%
  group_by(Species) %>%
  mutate(To = lead(From)) %>%
  select(Species, From, To, value)


#   Species From             To               value
#   <chr>   <chr>            <chr>            <int>
# 1 A       01.05.2019 00:00 01.05.2019 02:00     0
# 2 A       01.05.2019 02:00 01.05.2019 04:00     0
# 3 A       01.05.2019 04:00 01.05.2019 06:00     0
# 4 A       01.05.2019 06:00 01.05.2019 08:00     0
# 5 A       01.05.2019 08:00 01.05.2019 10:00     0
# 6 A       01.05.2019 10:00 01.05.2019 12:00     2
# 7 A       01.05.2019 12:00 01.05.2019 14:00     5
# 8 A       01.05.2019 14:00 01.05.2019 16:00     8
# 9 A       01.05.2019 16:00 01.05.2019 18:00     0
#10 A       01.05.2019 18:00 01.05.2019 20:00     0
# … with 14 more rows

数据

df <- structure(list(Date = c("01.05.2019", "02.05.2019"), Species = c("A", 
"A"), `00:00` = c(0L, 0L), `02:00` = c(0L, 0L), `04:00` = c(0L, 
0L), `06:00` = c(0L, 8L), `08:00` = c(0L, 0L), `10:00` = c(2L, 
4L), `12:00` = c(5L, 3L), `14:00` = c(8L, 0L), `16:00` = c(0L, 
0L), `18:00` = c(0L, 0L), `20:00` = c(0L, 0L), `22:00` = c(0L, 
0L)), class = "data.frame", row.names = c(NA, -2L))

与 Ronak Shah 基本相同,但使用 lubridate 作为日期时间部分:

library(tidyr)
library(dplyr)
library(lubridate)

df %>%
  pivot_longer(cols=-c("Date", "Species"), names_to="Time") %>%
  mutate(From = dmy(Date) + hm(Time), 
         To = dmy(Date) + hm(Time) + hm("02:00")) %>%
  select(Species, From, To, value)

哪个returns

# A tibble: 24 x 4
   Species From                To                  value
   <chr>   <dttm>              <dttm>              <dbl>
 1 A       2019-05-01 00:00:00 2019-05-01 02:00:00     0
 2 A       2019-05-01 02:00:00 2019-05-01 04:00:00     0
 3 A       2019-05-01 04:00:00 2019-05-01 06:00:00     0
 4 A       2019-05-01 06:00:00 2019-05-01 08:00:00     0
 5 A       2019-05-01 08:00:00 2019-05-01 10:00:00     0
 6 A       2019-05-01 10:00:00 2019-05-01 12:00:00     2
 7 A       2019-05-01 12:00:00 2019-05-01 14:00:00     5
 8 A       2019-05-01 14:00:00 2019-05-01 16:00:00     8
 9 A       2019-05-01 16:00:00 2019-05-01 18:00:00     0
10 A       2019-05-01 18:00:00 2019-05-01 20:00:00     0
# ... with 14 more rows