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)))
但为什么没有回收工作呢?我在这里遗漏了什么或者某处有错误吗?
答案 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
的情况下。正如您已经想到的那样,解决方法很简单。