【问题标题】:How do I reshape this table?如何重塑这张桌子?
【发布时间】:2020-06-30 09:25:03
【问题描述】:

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

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 包,表格需要如下所示:

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   

【问题讨论】:

  • 您可以使用dput 分享您的数据吗? IE。在问题的末尾发布dput(your_data) 的输出。
  • 这里是:structure(list(DATE = structure(1:2, .Label = c("01.05.2019", "02.05.2019"), class = "factor"), Species = structure(c(1L, 1L ), .Label = "A", class = "factor"), X01.00 = c(0L, 0L), X02.00 = c(0L, 0L), X04.00 = c(0L, 0L), X06.00 = c(0L, 0L), X08.00 = c(0L, 0L ), X10.00 = c(2L, 4L), X12.00 = c(5L, 3L), X14.00 = c(8L, 0L), X16.00 = c(0L, 0L), X18.00 = c(0L, 0L), X20.00 = c(0L, 0L ), X22.00 = c(0L, 0L)), class = "data.frame", row.names = c(NA, -2L))
  • From: 02.05.2019 22:00 的情况下你想要什么?您对To 的期望值是多少?注意:02.05.2019 22:00 代表表中的最后一个条目。
  • 在这种情况下,我想获得To: 03.05.2019 00:00。 22:00 的最后一个条目代表从 22:00 到次日 00:00 的持续时间

标签: r reshape reshape2


【解决方案1】:

或许,你可以试试:

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))

【讨论】:

  • 很好的解决方案。一个小问题:lead(From) 将在表格末尾创建一个NA。也许有一个简单的方法来处理这个。
  • 是的,这是真的。但是,我不确定在最后一种情况下 OP 想要什么输出。他们想引入原始数据中不存在的数据点吗?
【解决方案2】:

与 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多