1

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)))

但为什么回收不起作用?我在这里遗漏了什么还是某处有错误?

4

1 回答 1

2

注释的文档data.frame

传递给 data.frame 的对象应该具有相同的行数,但原子向量(参见 is.vector)、受 I 保护的因子和字符向量将在必要时被循环多次(包括作为列表参数的元素)。

如果您查看源代码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. 正如您已经发现的那样,解决方法很容易。

于 2014-08-13T04:55:04.633 回答