3 votes

Utilisation de R pour calculer le nombre total d'événements par jour à partir d'un cadre de données contenant tous les événements et leurs horodatages.

J'ai un cadre de données df qui contient des "messages". Chaque ligne est un message. Chaque message possède un horodatage appelé df$messagedate au format POSIXct %Y-%m-%d %H:%M:%S . Exemple :

> head(df)
messageid   user.id    message.date         
123         999       2011-07-17 17:54:27
456         888       2011-07-19 16:56:50

(Voici le dput() de ce qui précède) :

df <- structure(list(messageid = c(123L, 456L), user.id = c(999L, 888L), 
      message.date = structure(c(1310950467, 1311119810), class = c("POSIXct", 
      "POSIXt"), tzone = "")), .Names = c("messageid", "user.id", 
      "message.date"), row.names = c(NA, -2L), class = "data.frame")

Comment créer un cadre de données avec le nombre total de messages par jour ? Exemple :

day                   message.count 
2011-07-17             1
2011-07-18             0
2011-07-19             1

Plutôt que de ne pas inclure les dates sans message, je veux m'assurer que les message.count est fixé à zéro pour ces jours-là.

Ce que j'ai fait jusqu'à présent : J'ai extrait la partie jour du calendrier de message.date en faisant :

df$calendar.day<-as.POSIXct(strptime(substr(df$message.date,1,10),"%Y-%m-%d",tz="CST6CDT"))
> head(df$calendar.day)
[1] "2011-07-17 CDT" "2011-07-18 CDT" "2011-07-19 CDT"

À partir de là, je peux générer une liste de toutes les dates du calendrier dans la plage de dates : daterange <- seq(min(df$calendar.day), max(df$calendar.day), by="day")

2voto

Josh O'Brien Points 68397

Voici une solution assez simple qui utilise sapply() pour compter le nombre de messages à chaque date couverte par votre journal.

countMessages <- function(timeStamps) {
    Dates <- as.Date(strftime(df$message.date, "%Y-%m-%d"))
    allDates <- seq(from = min(Dates), to = max(Dates), by = "day")
    message.count <- sapply(allDates, FUN = function(X) sum(Dates == X))
    data.frame(day = allDates, message.count = message.count)
}

countMessages(df$message.date)
#          day message.count
# 1 2011-07-17             1
# 2 2011-07-18             0
# 3 2011-07-19             1

1voto

TARehman Points 1775

Vous devriez pouvoir utiliser as.data.frame sur la fonction table() pour contraindre les résultats du tableau dans un cadre de données. Par exemple :

test_data <- data.frame(date=c("March","April","April","May"),messageid=c(1,2,3,4),userid=c(55,33,1,56))
print(as.data.frame(table(test_data[1])))

Résultats en :

   Var1 Freq
1 April    2
2 March    1
3   May    1

Pour ajouter les dates qui ont zéro message, il me semble que vous pourriez générer un vecteur de toutes les dates applicables à votre projet (par exemple, si le fichier couvre une année entière), puis comparer ce vecteur au cadre de données créé à l'aide de l'instruction table. Il suffit de les fusionner et d'attribuer ensuite la valeur 0 à celles qui sont NA.

Par exemple :

months <- c("January","February","March","April","May","June")
full <- merge(counts,months,by=1,all=TRUE)

Il est évident que dans ce cas, la base de données sera bizarrement ordonnée, mais si vous créez un vecteur POSIX, cela ne devrait pas poser de problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X