为什么回收chron类在R中的data.frame中不起作用?

时间:2014-08-13 04:09:24

标签: r dataframe chron

data.frame回收较短的向量以匹配数据帧的长度。

test1 = data.frame(x = 1:5, date = as.Date("2013-05-01"))
  x       date
1 1 2013-05-01
2 2 2013-05-01
3 3 2013-05-01
4 4 2013-05-01
5 5 2013-05-01

但是,它似乎不适用于chron类:

require(chron)
test2 = data.frame(x = 1:5, time = times("08:00:00"))

Error in data.frame(x = 1:5, time = times("08:00:00")) : 
arguments imply differing number of rows: 5, 1

有解决方法,例如手动进行回收,如:

test3 = data.frame(x = 1:5, time = times(rep("08:00:00",5)))

但为什么没有回收工作呢?我在这里遗漏了什么或者某处有错误吗?

1 个答案:

答案 0 :(得分:1)

data.frame笔记的文档:

  

传递给data.frame的对象应该具有相同的行数,但是   原子矢量(见is.vector),因子和特征向量   如有必要,受我保护将被回收多次   (包括作为列表参数的元素)。

如果查看data.frame的来源,您实际上可以看到对is.vector的检查。

所以问题是,你的times对象是一个向量吗?答案是否定的:

is.vector(times("8:00:00"))
# [1] FALSE

这是为什么? ?is.vector告诉我们更多信息:

  如果x是具有指定模式的向量,则

is.vector返回TRUE   没有名称以外的属性。否则返回FALSE。

如果仔细查看times对象,可以看到它确实具有非名称属性:

str(times("8:00:00"))
# Class 'times'  atomic [1:1] 0.333
#  ..- attr(*, "format")= chr "h:m:s"

有趣的是,Date个对象也不是向量,但是data.frame会成为异常。

因此,最终,回收规则实际上可能是回收例外,至少在data.frame的情况下。正如您已经想到的那样,解决方法很简单。