【问题标题】:as.POSIXct.numeric error when executing ldply执行 ldply 时出现 as.POSIXct.numeric 错误
【发布时间】:2015-09-27 05:12:46
【问题描述】:

我有一个包含 3 个数据帧的列表“list.of.df”,我使用来自 plyr 包的 ldply 强制转换为一个包含所有数据帧列的单个数据帧,即

df <- ldply(list.of.df)

这种方法以前可行,但今天我有一组新数据,我收到错误

as.POSIXct.numeric(what, tz = tzone) 中的错误:必须提供“原点”

3个数据框中有几个POSIXct变量,所以每次我有一组新数据时手动排错可能有点麻烦。相反,有没有办法让我通过ldply 调用中所需的origin

该列表可以通过邮箱链接hereloaded。

【问题讨论】:

  • 当我尝试dget 您的文件时,我收到一个错误:Error in parse(file = file, keep.source = keep.source) : invalid multibyte character in parser at line 3256。在编辑器中打开文本时也是如此。
  • 这很奇怪。已替换为要加载的 Rdata 文件。感谢@Pascal 的提醒。
  • 你可以用一个更简单的例子来复制你的问题 - 例如:list.of.df &lt;- list(data.frame(a=Sys.time()),data.frame(a=1)); ldply(list.of.df) - 我怀疑你的问题归结为同名列之间的数据类型(数字/日期)不匹配。

标签: r plyr


【解决方案1】:

错误的原因是“BILLING SUBMISSION”列在您的前两个列表元素(它们是数据框)中有日期,但在最后一个数据框中有一个数字列。 ldply 正在尝试使用 as.POSIX 系列函数将数值隐式转换为 POSIX 日期值,为此,需要显式指定原点。请参阅下面的解决方案:

  1. 确保您尝试合并的每个数据帧中的所有数据类型都相同或相似。您可以使用以下代码实现此目的,使用 lapply 循环您的列表:

    load(list.of.df)
    b <- lapply(list.of.df, function(x){
                      x[, "BILLING SUBMISSION"] <- as.POSIXct(x[, "BILLING SUBMISSION"], origin = "1970-01-01"); return(x)})
    df <- ldply(b)
    

为了以后安全起见,您可能应该将列名更改为正确的 R 列名。希望这会有所帮助。

【讨论】:

  • @Ricky - 这个答案应该被接受 - 这绝对是问题所在。
  • @thelatemail 它确实有效,我已经赞成。在接受作为最终答案之前,我将再等待一段时间,看看是否有更通用的方法不需要我识别字段名称 "BILLING SUBMISSION" 。我得到的数据经常发生变化(多个我无法控制的 Excel 文件,并且有更改字段名称/内容的讨厌习惯),因此我最初想到将参数传递给 ldply 以自行解决问题。
  • @Ricky - 我怀疑如果没有大量额外的检查代码,这是否真的可行。最终,生成数据的任何过程都应该检查每个字段的格式是否正确。
  • @Ricky - 我同意 thelatemail 的观点,即您必须检查生成数据的过程,并可能发布问题以获得解决该问题的答案。在不知道您的数据未来会发生什么变化的情况下,试图概括上述答案是不可能的。这就是为什么它直接回答了上面提出的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多