web-dev-qa-db-fra.com

Problèmes avec les données dplyr et POSIXlt

J'ai un problème. J'ai téléchargé des données et des dates transformées au format POSIXlt

df<-read.csv("007.csv", header=T, sep=";")
df$transaction_date<-strptime(df$transaction_date, "%d.%m.%Y")
df$install_date<-strptime(df$install_date, "%d.%m.%Y")
df$days<- as.numeric(difftime(df$transaction_date,df$install_date, units = "days"))

Le cadre de données concerne la transaction dans un jeu en ligne. Il contient la valeur (son paiement), transaction_date, intall_date et ID. J'ai ajouté une nouvelle colonne, qui s'affiche après l'installation. J'ai essayé de résumer les données en utilisant dlyr

df2<-df %>% group_by(days) %>% summarise(sum=sum(value))

Et j'ai une erreur: Erreur: la colonne 'transaction_date' a un type non supporté: POSIXlt, POSIXt

Comment puis-je le réparer?

UPD. J'ai changé les classes de colonnes Date en Caractère. Cela a résolu le problème. Mais puis-je utiliser dlyr sans changer de classe dans mon jeu de données?

18
Slavka

Vous pouvez utiliser as.POSIXct comme recommandé dans les commentaires, mais si les heures, les minutes et les secondes importent peu, vous devez simplement utiliser as.Date

df <- read.csv("007.csv", header=T, sep=";")

df2 <- df %>%
  mutate(
     transaction_date = as.Date(transaction_date, "%d.%m.%Y")
     ,install_date = as.Date(install_date, "%d.%m.%Y")
  ) %>%
  group_by(days = transaction_date - install_date) %>%
  summarise(sum=sum(value))
10
JackStat

Comme noté ici , il s’agit d’une "caractéristique" de la tidyverse. Ils ne veulent pas gérer l'objet POSIXlt car il s'agit d'une sorte de liste dans un vecteur. Cependant, utiliser as.POSIXct n'est pas toujours une option. Dans mon cas, j'avais vraiment besoin de la classe POSIXlt pour gérer des données non nettoyées. Dans ce cas, revenez à la bonne vieille base stable R. Dans votre cas:

df2 <- aggregate(df1$value, by=list(df$days), sum)
4
Bastien

Un truc que j'utilise souvent est le suivant:

  1. Convertir les colonnes POSIXt (dans l'exemple ci-dessous eventDate) en caractère
  2. Effectuez les opérations dplyr dont vous avez besoin (dans l'exemple ci-dessous, nous lions des lignes de deux trames de données)
  3. Reconvertir de caractère en POSIXt sans oublier de définir le bon format (format) et le fuseau horaire (tz) tels qu'ils étaient avant la première étape.

Exemple:

# step 1
df1$eventDate <- as.character.POSIXt(df1$eventDate)
df2$eventDate <- as.character.POSIXt(df2$eventDate)
#step 2
merged_df <- bind_rows(df1, df2)
#step 3
merged_df$eventDate <- strptime(merged_df$eventDate, format = "%Y-%m-%d", tz = "UTC")
0
damianooldoni