it-swarm.com.de

Probleme mit Dplyr und POSIXlt Daten

Ich habe ein Problem. Ich habe Daten heruntergeladen und Datumsangaben in das POSIXlt-Format umgewandelt

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"))

Beim Datenrahmen geht es um die Transaktion in einem Online-Spiel. Es enthält den Wert (seine Zahlung), das Transaktionsdatum, das Datum und die ID. Ich habe eine neue Spalte hinzugefügt, die nach der Installation noch angezeigt wird. Ich habe versucht, Daten mit Dlyr zusammenzufassen

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

Und ich habe einen Fehler: Fehler: Spalte 'transaction_date' hat nicht unterstützten Typ: POSIXlt, POSIXt

Wie kann ich es reparieren?

UPD. Ich habe Klassen von Datumsspalten in Zeichen geändert. Es wurde das Problem gelöst. Aber kann ich Dlyr verwenden, ohne Klassen in meinem Datensatz zu ändern?

18
Slavka

Sie können as.POSIXct wie in den Kommentaren empfohlen verwenden, aber wenn die Stunden, Minuten und Sekunden keine Rolle spielen, sollten Sie 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

Wie hier erwähnt, handelt es sich hierbei um ein "Merkmal" des Tidyverse. Sie möchten kein POSIXlt-Objekt behandeln, da es sich um eine Art Liste innerhalb eines Vektors handelt. Die Verwendung von as.POSIXct ist jedoch nicht immer eine Option. In meinem Fall brauchte ich wirklich die POSIXlt-Klasse, um ungereinigte Daten zu verarbeiten. In diesem Fall kehren Sie einfach zur guten alten stabilen Basis R zurück. In Ihrem Fall:

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

Ein Trick, den ich oft benutze, ist folgender:

  1. Konvertieren Sie POSIXt-Spalten (im Beispiel unter eventDate) in Zeichen
  2. Führe Dplyr-Operationen aus, die du brauchst (im Beispiel unten binden wir Zeilen von zwei Datenrahmen)
  3. Konvertieren Sie die Zeichen wieder in POSIXt, wobei Sie nicht vergessen, das richtige Format (format) und die Zeitzone (tz) wie vor Schritt 1 festzulegen.

Beispiel:

# 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