我有以下数据:
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))中的错误:未为日期对象定义
但是,在这种情况下使用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发布于 2011-12-28 15:51:39
这可以说是xtable中的一个bug --您可能需要向维护人员报告它。
临时工作是在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, ...)
}发布于 2011-12-28 15:48:32
显然,xtable并不总是很好地处理类Date列。(它确实有和ts方法,但如果在数据帧中有一列日期/时间,这些方法可能没有帮助,因为胁迫似乎会更改结果表中的列名。)几个注意事项:
print.xtable (而不是xtable.data.frame)引发的,默认情况下调用该错误是为了在控制台中显示xtable的结果。所以您会发现,如果将xtable的结果存储在变量中,就不会出现错误,但是当您尝试使用print时,也会弹出相同的错误。由于您明智地以YYYY DD格式存储了您的日期,所以使用有序的选择将它们转换为日期对象实际上是不必要的,因为它们将正确地排序为字符。因此,您可以简单地将它们保留为具有更复杂的日期/时间对象的characters.xtable.data.frame创建一个包装器并在开头添加行,日期<- sapply(x,FUN = function(x){class(x) == "Date"}) x,Date <- as.character(x,Date)
检查类日期或您正在处理的任何类。
xtable.data.frame可能也应该检查日期,可能也检查其他POSIX类并将它们转换为字符串。这可能是一个简单的更改,可能值得联系包作者about.
发布于 2019-07-03 09:43:52
作为xtable的维护者,我想说明我所看到的关于xtable中日期的真实位置。
这并不是一个真正的bug,但是缺少一个您可能认为是可取的特性。
问题是xtable只能处理三种不同类型的列:逻辑列、字符列和数字列。如果尝试提交列类为Date的表,则无法处理该表。相关代码是xtable方法的集合,其中最重要的是xtable.data.frame和xtable.matrix。
这些方法的代码的第一部分涉及检查提交的列的类,以便对它们进行适当的处理。
也可以添加允许类日期列的代码,但我不愿意这样做。
首先,有一个简单的工作(至少对于直接的R代码,我不能说对于闪亮的应用程序),就是将任何日期列更改为字符列:
第二,为了允许类日期列,需要向xtable和xtable方法(目前有31个方法)以及xtableFtable和xtableList添加一个参数。这充满了问题,因为xtable存在大量的反向依赖关系。(还没有统计,但如果您查看CRAN上的xtable,您将看到一堆依赖项、导入和建议。)如果我做出这样的改变,我会破坏一些包裹,也许很多包裹。向后兼容性是xtable的一个严重问题。
为什么还需要额外的争论呢?因为使用xtable或更多的print.xtable的最终结果是字符串。如何处理提交给xtable的数据帧、矩阵或其他结构的列,首先取决于它们的分类方式(逻辑、字符或数字),然后由参数对齐、数字和显示来决定,这些参数都可以作为向量,允许对不同的列进行不同的处理。因此,如果允许日期,则需要一个额外的参数来指定如何格式化日期,因为在某些时候,需要将它们转换为字符以生成最终的表输出。
https://stackoverflow.com/questions/8652674
复制相似问题