【问题标题】:Why recycling chron class doesn't work in data.frame in R?为什么回收 chron 类在 R 的 data.frame 中不起作用?
【发布时间】:2014-08-13 04:09:24
【问题描述】:

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

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

【问题讨论】:

  • 不利用x的长度来做:transform(data.frame(x = 1:5, time = "08:00:00"), time = times(time))

标签: r dataframe chron


【解决方案1】:

data.frame 的文档说明:

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

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

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

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

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

is.vector 如果 x 是具有指定模式的向量,则返回 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的情况下是这样。正如您已经发现的那样,解决方法很简单。

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2021-06-14
    • 2015-06-30
    • 1970-01-01
    • 2016-12-21
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多