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?
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))
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)
Un truc que j'utilise souvent est le suivant:
POSIXt
(dans l'exemple ci-dessous eventDate
) en caractèrePOSIXt
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")