首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R: xtable和日期

R: xtable和日期
EN

Stack Overflow用户
提问于 2011-12-28 06:32:00
回答 4查看 6.7K关注 0票数 22

我有以下数据:

代码语言:javascript
复制
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

正在运行

代码语言:javascript
复制
> library(xtable)
> xtable(evolution)

效果很好。但如果我加上这行

代码语言:javascript
复制
evolution$date <- as.Date(evolution$date, "%Y-%m-%d");

给予

代码语言:javascript
复制
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对日期进行一些筛选是有用的。

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-28 15:51:39

这可以说是xtable中的一个bug --您可能需要向维护人员报告它。

临时工作是在as.character()错误解释的类上调用xtable (除了“日期”之外,我可以想到"POSIXt“,但可能还有其他类),例如:

代码语言:javascript
复制
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, ...)
}
票数 25
EN

Stack Overflow用户

发布于 2011-12-28 15:48:32

显然,xtable并不总是很好地处理类Date列。(它确实有和ts方法,但如果在数据帧中有一列日期/时间,这些方法可能没有帮助,因为胁迫似乎会更改结果表中的列名。)几个注意事项:

  1. 错误实际上是由print.xtable (而不是xtable.data.frame)引发的,默认情况下调用该错误是为了在控制台中显示xtable的结果。所以您会发现,如果将xtable的结果存储在变量中,就不会出现错误,但是当您尝试使用print时,也会弹出相同的错误。由于您明智地以YYYY DD格式存储了您的日期,所以使用有序的选择将它们转换为日期对象实际上是不必要的,因为它们将正确地排序为字符。因此,您可以简单地将它们保留为具有更复杂的日期/时间对象的characters.
  2. In案例,这样您就可以先执行子设置,然后将这些列转换为字符。或者为xtable.data.frame创建一个包装器并在开头添加行,

日期<- sapply(x,FUN = function(x){class(x) == "Date"}) x,Date <- as.character(x,Date)

检查类日期或您正在处理的任何类。

  • IMHO,xtable.data.frame可能也应该检查日期,可能也检查其他POSIX类并将它们转换为字符串。这可能是一个简单的更改,可能值得联系包作者about.

  • Lastly,分号,因为行终止符是不必要的。)来自另一种语言的习惯?
票数 13
EN

Stack Overflow用户

发布于 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的数据帧、矩阵或其他结构的列,首先取决于它们的分类方式(逻辑、字符或数字),然后由参数对齐、数字和显示来决定,这些参数都可以作为向量,允许对不同的列进行不同的处理。因此,如果允许日期,则需要一个额外的参数来指定如何格式化日期,因为在某些时候,需要将它们转换为字符以生成最终的表输出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8652674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档