[英]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.