2011-12-28 12 views
18

tengo los siguientes datos:R: xtable y fechas

transaction <- c(1,2,3); 
date <- c("2010-01-31","2010-02-28","2010-03-31"); 
type <- c("debit", "debit", "credit"); 
amount <- c(-500, -1000.97, 12500.81); 
oldbalance <- c(5000, 4500, 17000.81) 
evolution <- data.frame(transaction, date, type, amount, oldbalance, row.names=transaction, stringsAsFactors=FALSE); 
evolution <- transform(evolution, newbalance = oldbalance + amount); 
evolution 

Correr

> library(xtable) 
> xtable(evolution) 

funciona bien. Pero si añado la línea

evolution$date <- as.Date(evolution$date, "%Y-%m-%d"); 

en hacerle

transaction <- c(1,2,3); 
date <- c("2010-01-31","2010-02-28","2010-03-31"); 
type <- c("debit", "debit", "credit"); 
amount <- c(-500, -1000.97, 12500.81); 
oldbalance <- c(5000, 4500, 17000.81) 
evolution <- data.frame(transaction, date, type, amount, oldbalance, row.names=transaction, stringsAsFactors=FALSE); 
evolution$date <- as.Date(evolution$date, "%Y-%m-%d"); 
evolution <- transform(evolution, newbalance = oldbalance + amount); 
evolution 

luego corriendo xtable da

xtable (evolución) error en Math.Date (x + ifelse (x == 0, 1, 0)): abs no definido para objetos de fecha

Pero puede ser útil el uso de xtable en tal caso hacer algún tipo de filtrado de fechas

evolution$date <- as.Date(evolution$date, "%Y-%m-%d") 
startdate <-as.Date("2010-02-01"); 
enddate <-as.Date("2010-03-30"); 
newdate <-evolution[which (evolution$date >= startdate & evolution$date <= enddate),] 
newdate 


> newdate 
    transaction  date type amount oldbalance newbalance 
2   2 2010-02-28 debit -1000.97  4500 3499.03 
> xtable(newdate) 
Error in Math.Date(x + ifelse(x == 0, 1, 0)) : 
    abs not defined for Date objects 

Respuesta

21

Este es sin duda un error en xtable - es posible que desee informar de ello al mantenedor.

Una solución alternativa temporal es llamar as.character() en las clases que xtable malinterpreta (aparte de "fecha" se me ocurre "POSIXt", pero puede haber otros), ej .:

xtable <- function(x, ...) { 
    for (i in which(sapply(x, function(y) !all(is.na(match(c("POSIXt","Date"),class(y))))))) x[[i]] <- as.character(x[[i]]) 
    xtable::xtable(x, ...) 
} 
+0

@ Simon. Gracias por esta interesante respuesta. 1 voto arriba – yCalleecharan

11

sí parece que xtable no siempre juegan muy bien con columnas de clase Date. (Tiene zoo y ts métodos, pero puede que no funcionen si tiene una sola columna de fechas/horas en un marco de datos, ya que la coacción zoo parece alterar los nombres de columna en la tabla resultante.) a pocas notas:

  1. el error de hecho está siendo lanzada por print.xtable, (no xtable.data.frame), que se denomina de forma predeterminada con el fin de mostrar los resultados de xtable en la consola. Así que encontraría que si almacenó los resultados de xtable en una variable, no obtendría ningún error, pero cuando intente con print, aparecerá el mismo error.

  2. Dado que ha almacenado las fechas en formato AAAA-MM-DD, no es necesario convertirlas en objetos Date para usar las selecciones ordenadas, ya que se ordenarán correctamente como caracteres. Entonces, podrías salirte con la tuya simplemente manteniéndolos como personajes.

  3. En los casos con objetos de fecha/hora más complejos, primero puede hacer la subconjunto y luego convertir esas columnas en caracteres. O crear un contenedor para xtable.data.frame y añadir las líneas al principio,

    dates <- sapply(x,FUN = function(x){class(x) == "Date"}) 
    x[,dates] <- as.character(x[,dates]) 
    

    la comprobación de la clase Date, o lo que sea la clase que estamos tratando.

  4. En mi humilde opinión, xtable.data.frame probablemente debería estar buscando fechas, y posiblemente también otras clases POSIX, y convertirlas a cadenas también. Esto puede ser un cambio simple, y puede valer la pena contactar con el autor del paquete.

  5. Por último, los puntos y comas como terminadores de línea no son necesarios. :) Hábito de otro idioma?

+0

@ Joran. Gracias por sus comentarios y sí ... es un hábito de otro idioma :). 1 voto arriba – yCalleecharan

Cuestiones relacionadas