2011-12-28 24 views
18

,我有以下數據:R:xtable和日期

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 

運行

> library(xtable) 
> xtable(evolution) 

工作正常。但是,如果我添加行

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

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 

然後運行xtable

xtable(進化) 錯誤Math.Date(X + ifelse(x == 0,1,0)): abs未定義日期對象

但可以使用xtable在這種情況下做的日期

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 

回答

21

這可以說是xtable中的一個錯誤 - 您可能希望將其報告給維護者。

的臨時解決辦法是調用as.character()xtable曲解(除了「日期」我能想到的「POSIXt」的,但有可能是其他人)的類,例如:

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。感謝這個有趣的答案。 1投票。 – yCalleecharan 2011-12-29 07:48:14

11

的一些過濾它似乎xtable並不總是很好地與類Date列打有用的。 (它確實有動物園ts方法,但如果您在數據框中有單列日期/時間,這些方法可能沒有幫助,因爲對動物園的強制似乎會改變生成的表中的列名稱。 )的幾個注意事項:

  1. 錯誤實際上是由於print.xtable,(不xtable.data.frame),在缺省情況下,才能在控制檯中顯示的xtable結果稱爲拋出。所以你會發現如果你將xtable的結果存儲在一個變量中,你不會得到任何錯誤,但是當你嘗試print時,會出現同樣的錯誤。

  2. 由於您明智地以YYYY-MM-DD格式存儲了日期,因此將它們轉換爲Date對象實際上不需要使用有序選擇,因爲它們將按字符正確排序。所以你實際上可以簡單地把它們保留爲字符。

  3. 在具有更復雜的日期/時間對象的情況下,您可以先進行子集處理,然後將這些列轉換爲字符。或者創建一個包裝爲xtable.data.frame,在開始處添加行,

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

    檢查類Date,或任何類你處理。

  4. 恕我直言,xtable.data.frame應該可能會檢查日期,並可能爲其他POSIX類以及將它們轉換爲字符串以及。這可能是一個簡單的改變,可能值得與軟件包作者聯繫。

  5. 最後,作爲行結束符的分號不是必需的。 :)習慣從另一種語言?

+0

@ joran。感謝您的意見和是的..他的習慣從另一種語言:)。 1投票。 – yCalleecharan 2011-12-29 07:49:13