Анализ данных в порядке столбца, а затем строки в R - PullRequest
0 голосов
/ 28 мая 2020

У меня есть набор данных, записанных с интервалом в 5 минут, который также включает данные с интервалом в 1 минуту, обозначенные _1 - _5 в заголовке. Каждая строка представляет собой 5-минутный интервал.

datetime            temp  speed_1  speed_2  speed_3  speed_4  speed_5
20190710 09:00:00   21    13       14       26       29       32
20190710 09:05:00   21    28       28       29       38       12
20190710 09:10:00   20    8        15       29       30       19
20190711 11:12:00   18    6        9        18       51       49
20190711 11:17:00   17    49       48       48       30       10

Фактический набор данных имеет дополнительные 25 столбцов данных, регистрируемых с 5-минутными интервалами, и состоит примерно из 25000 строк.

Я ищу эффективный способ анализа скорости на каждый день. Например, если бы я хотел построить график скорости для каждого дня, мне потребовалось бы от speed_1 до speed_5 с самого раннего входа в определенный день, скажем, 09:00:00, а затем от speed_1 до speed_5 со следующего раза, с 09:05:00, и так далее в течение всего дня.

В настоящее время я создал дополнительный фрейм данных для скорости, которая заполняет время, чтобы дать:

datetime            speed
20190710 09:00:00   13
20190710 09:01:00   14
20190710 09:02:00   26
20190710 09:03:00   29      
20190710 09:04:00   32

Это приводит к получению второго df равного 125000 записи. Мне было интересно, есть ли более эффективный с точки зрения памяти способ анализа исходного набора данных, поскольку наборы данных могут значительно вырасти в будущем.

Изменить: добавлен воспроизводимый код

structure(list(time = structure(1:3, .Label = c("20190710 09-00-00", "20190710 09-05-00", "20190710 09-10-00"), class = "factor"), temp = c(21, 21, 20), speed_1 = c(13, 28, 8), speed_2 = c(14, 28, 15), speed_3 = c(26, 29, 29), speed_4 = c(29, 38, 30), speed_5 = c(32, 12, 19)), .Names = c("time", "temp", "speed_1", "speed_2", "speed_3", "speed_4", "speed_5"), row.names = c(NA, -3L), class = "data.frame")

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Вот версия dplyr:

library(tidyverse)
library(lubridate)

df <- read.table(text='datetime            temp  speed_1  speed_2  speed_3  speed_4  speed_5
"20190710 09:00:00"   21    13       14       26       29       32
"20190710 09:05:00"   21    28       28       29       38       12
"20190710 09:10:00"   20    8        15       29       30       19
"20190711 11:12:00"   18    6        9        18       51       49
"20190711 11:17:00"   17    49       48       48       30       10',header=T)

# we take our dataframe
df %>%
    # ...then we put all the speed columns in one column
    pivot_longer(starts_with("speed_")
                 , names_to = "minute"
                 , values_to = "speed") %>%
    # ...then we...
    mutate(datetime = ymd_hms(datetime) #...turn the "datetime" column actually into a datetime format
           , minute = gsub("speed_", "", minute) %>% as.numeric() # ...remove "speed_" from the former column names (which are now in column "speed")
           , datetime = datetime + minutes(minute - 1)) # ...and add the minute to our datetime...

... чтобы получить это:

# A tibble: 25 x 4
   datetime             temp minute speed
   <dttm>              <int>  <dbl> <int>
 1 2019-07-10 09:00:00    21      1    13
 2 2019-07-10 09:01:00    21      2    14
 3 2019-07-10 09:02:00    21      3    26
 4 2019-07-10 09:03:00    21      4    29
 5 2019-07-10 09:04:00    21      5    32
 6 2019-07-10 09:05:00    21      1    28
 7 2019-07-10 09:06:00    21      2    28
 8 2019-07-10 09:07:00    21      3    29
 9 2019-07-10 09:08:00    21      4    38
10 2019-07-10 09:09:00    21      5    12
# ... with 15 more rows
0 голосов
/ 28 мая 2020

Вот что-то необработанное с использованием data.table:

library(data.table)
setDT(df)
df[, time := as.POSIXct(time, format="%Y%m%d %H-%M-%OS")]
out <- 
  df[, !"temp"
   ][, melt(.SD, id.vars = "time")
     ][, time := time + (rleid(variable)-1)*60, time
       ][order(time), !"variable"]
out

#                    time value
#  1: 2019-07-10 09:00:00    13
#  2: 2019-07-10 09:01:00    14
#  3: 2019-07-10 09:02:00    26
#  4: 2019-07-10 09:03:00    29
#  5: 2019-07-10 09:04:00    32
#  6: 2019-07-10 09:05:00    28
#  7: 2019-07-10 09:06:00    28
#  8: 2019-07-10 09:07:00    29
#  9: 2019-07-10 09:08:00    38
# 10: 2019-07-10 09:09:00    12
# 11: 2019-07-10 09:10:00     8
# 12: 2019-07-10 09:11:00    15
# 13: 2019-07-10 09:12:00    29
# 14: 2019-07-10 09:13:00    30
# 15: 2019-07-10 09:14:00    19

Data:

df <- data.frame(
  time = factor(c("20190710 09-00-00", "20190710 09-05-00", "20190710 09-10-00")),
  temp = c(21, 21, 20),
  speed_1 = c(13, 28, 8),
  speed_2 = c(14, 28, 15),
  speed_3 = c(26, 29, 29),
  speed_4 = c(29, 38, 30),
  speed_5 = c(32, 12, 19)
)
0 голосов
/ 28 мая 2020

Некоторые примеры данных и ожидаемый результат могут очень помочь. В любом случае я попробовал. Вы можете сделать это, если вам просто нужен список всех скоростей для каждой даты.

dataset <- read.table(text='datetime            temp  speed_1  speed_2  speed_3  speed_4  speed_5
"20190710 09:00:00"   21    13       14       26       29       32
"20190710 09:05:00"   21    28       28       29       38       12
"20190710 09:10:00"   20    8        15       29       30       19
"20190711 11:12:00"   18    6        9        18       51       49
"20190711 11:17:00"   17    49       48       48       30       10',header=T)


dataset$datetime <- as.POSIXlt(dataset$datetime,format="%Y%m%d %H:%M:%OS")

lapply(split(dataset,as.Date(dataset$datetime)), function(x) c(t(x[,3:ncol(x)])) )

вывод:

  $`2019-07-10`
 [1] 13 14 26 29 32 28 28 29 38 12  8 15 29 30 19

$`2019-07-11`
 [1]  6  9 18 51 49 49 48 48 30 10

Изменить: обновлен ответ, чтобы скорости были правильными заказ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...