funcion - filtros en r
Problemas con los datos dplyr y POSIXlt (3)
Como se señala here , esta es una "característica" del tidyverse. No quieren manejar el objeto POSIXlt
porque es algún tipo de lista dentro de un vector. Sin embargo, usar as.POSIXct
no siempre es una opción. En mi caso, realmente necesitaba la clase POSIXlt
para manejar algunos datos sin limpiar. En ese caso, simplemente vuelva a la antigua base estable R: En su caso:
df2 <- aggregate(df1$value, by=list(df$days), sum)
Tengo un problema. Descargué datos y transformé las fechas en formato 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"))
El marco de datos se trata de transacciones en un juego en línea. Contiene valor (su pago), transaction_date, intall_date y ID. Agregué nueva columna, que se muestra días después de la instalación. Intenté resumir los datos usando dlyr
df2<-df %>% group_by(days) %>% summarise(sum=sum(value))
Y tengo un error: Error: la columna ''transaction_date'' no es compatible con el tipo: POSIXlt, POSIXt
¿Cómo puedo arreglarlo?
UPD. Cambié las clases de columnas de fecha en caracteres. Se solucionó el problema. ¿Pero puedo usar dlyr sin cambiar las clases en mi conjunto de datos?
Puede usar as.POSIXct
como se recomienda en los comentarios, pero si las horas, los minutos y los segundos no importan, entonces solo debe usar 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))
Un truco que uso a menudo es el siguiente:
- Convertir columnas
POSIXt
(en el ejemplo debajo deeventDate
) a carácter - Realice las operaciones de dplyr que necesita (en el siguiente ejemplo, enlazamos filas de dos marcos de datos)
- Convierta de nuevo el carácter a
POSIXt
sin olvidar configurar el formato (format
) y la zona horaria (tz
) correctos tal como estaban antes de realizar el paso 1.
Ejemplo:
# 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")