繁体   English   中英

如何重塑这张桌子?

[英]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 package 需要如下所示:

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)

返回

# 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM