Je commence avec R, alors s'il te plaît, supporte-moi

Par exemple, j'ai cet objet data.table (ou data.frame):

Time               Station      count_starts    count_ends
01/01/2015 00:30       A            2               3
01/01/2015 00:40       A            2               1
01/01/2015 00:55       B            1               1
01/01/2015 01:17       A            3               1
01/01/2015 01:37       A            1               1

Mon objectif final est de regrouper la colonne "Heure" par heure et de faire la somme des count_starts et count_ends en fonction de l'heure et de la station horaires:

Time               Station      sum(count_starts)   sum(count_ends)
01/01/2015 01:00       A            4                      4
01/01/2015 01:00       B            1                      1
01/01/2015 02:00       A            4                      2

J'ai fait quelques recherches et j'ai découvert que je devais utiliser la bibliothèque xts.

Merci de m'avoir aidé

MISE À JOUR :

J'ai converti le type de transactions$Time en POSIXct, donc le package xts devrait pouvoir utiliser directement les séries temporelles.

0
Blaze Tama 28 nov. 2017 à 06:37

3 réponses

Meilleure réponse

En utilisant la base R, nous pouvons toujours faire ce qui précède. Seulement que l'heure sera une de moins pour tous:

 dat=read.table(text = "Time               Station      count_starts    count_ends
 '01/01/2015 00:30'       A            2               3
 '01/01/2015 00:40'       A            2               1
 '01/01/2015 00:55'       B            1               1
 '01/01/2015 01:17'       A            3               1
 '01/01/2015 01:37'       A            1               1",
             header = TRUE, stringsAsFactors = FALSE)

 dat$Time=cut(strptime(dat$Time,"%m/%d/%Y %H:%M"),"hour")
 aggregate(.~Time+Station,dat,sum)
                  Time Station count_starts count_ends
 1 2015-01-01 00:00:00       A            4          4
 2 2015-01-01 01:00:00       A            4          2
 3 2015-01-01 00:00:00       B            1          1

Vous pouvez utiliser la fonction order pour réorganiser le tableau ou même la fonction sort.POSIXlt:

 m=aggregate(.~Time+Station,dat,sum)
 m[order(m[,1]),]
                  Time Station count_starts count_ends
 1 2015-01-01 00:00:00       A            4          4
 3 2015-01-01 00:00:00       B            1          1
 2 2015-01-01 01:00:00       A            4          2
1
Onyambu 28 nov. 2017 à 06:07

Il y a essentiellement deux choses requises: 1) tour de l'heure à la fenêtre d'une heure la plus proche:

library(data.table)

library(lubridate)

data=data.table(Time=c('01/01/2015 00:30','01/01/2015 00:40','01/01/2015 00:55','01/01/2015 01:17','01/01/2015 01:37'),Station=c('A','A','B','A','A'),count_starts=c(2,2,1,3,1),count_ends=c(3,1,1,1,1))

data[,Time_conv:=as.POSIXct(strptime(Time,'%d/%m/%Y %H:%M'))]

data[,Time_round:=floor_date(Time_conv,unit="1 hour")]

2) Répertoriez le tableau de données obtenu ci-dessus pour obtenir le résultat souhaité:

New_data=data[,list(count_starts_sum=sum(count_starts),count_ends_sum=sum(count_ends)),by='Time_round']
0
www 28 nov. 2017 à 11:28

Une solution utilisant dplyr et lubridate. La clé est d'utiliser ceiling_date pour convertir la colonne de date et d'heure en pas de temps horaire, puis de regrouper et de résumer les données.

library(dplyr)
library(lubridate)

dt2 <- dt %>%
  mutate(Time = mdy_hm(Time)) %>%
  mutate(Time = ceiling_date(Time, unit = "hour")) %>%
  group_by(Time, Station) %>%
  summarise(`sum(count_starts)` = sum(count_starts),
            `sum(count_ends)` = sum(count_ends)) %>%
  ungroup()
dt2
# # A tibble: 3 x 4
#                  Time Station `sum(count_starts)` `sum(count_ends)`
#                <dttm>   <chr>               <int>             <int>
# 1 2015-01-01 01:00:00       A                   4                 4
# 2 2015-01-01 01:00:00       B                   1                 1
# 3 2015-01-01 02:00:00       A                   4                 2

DONNÉES

dt <- read.table(text = "Time               Station      count_starts    count_ends
'01/01/2015 00:30'       A            2               3
'01/01/2015 00:40'       A            2               1
'01/01/2015 00:55'       B            1               1
'01/01/2015 01:17'       A            3               1
'01/01/2015 01:37'       A            1               1",
                 header = TRUE, stringsAsFactors = FALSE)

Explication

mdy_hm est la fonction pour convertir la chaîne en classe date-time. Cela signifie "mois-jour-année heure-minute", qui dépend de la structure de la chaîne. ceiling_date arrondit un objet date-heure vers le haut en fonction de l'unité spécifiée. group_by consiste à regrouper la variable. summarise consiste à effectuer une opération récapitulative.

1
www 28 nov. 2017 à 04:02
47523589