【问题标题】:Slow String to Date Conversion Function慢速字符串到日期转换函数
【发布时间】:2014-06-12 17:31:13
【问题描述】:

我编写了以下函数来将字符串向量转换为日期向量(for 循环内的代码受到这篇文章的启发:R help converting factor to date)。当我传入一个大小为 1000 的向量时,这大约需要 30 秒。不是很慢,但我最终需要传递大约 100,000,所以这可能是一个问题。任何想法为什么这很慢和/或如何加快速度?

toDate <- function (dates) 
{
    theDates <- vector()
    for(i in 1:length(dates))
    {
        temp <- factor(dates[i])
        temp <- as.Date(temp, format = "%m/%d/%Y")
        theDates[i] <- temp
    }
 class(theDates) <- "Date"
 return(theDates)
}

【问题讨论】:

  • 请提供可重复的示例?链接问题中给出的答案有什么问题,已经矢量化了???
  • 我不确定我是否理解您的问题。代码有效,只是速度很慢,所以我想知道是否有更好的方法来完成我想做的事情。
  • 您对as.Date() 产生了 100,000 次调用,每次迭代调用一次。当as.Date() 已经矢量化时,这很愚蠢,因此你可以只做as.Date(dates, format = "%m/%d/%Y") - 如果它们已经是一个,你不需要转换为一个因子,如果不是,它们将是字符所以将这种转换为因子会产生更多开销。
  • 啊,我明白了。谢谢!它现在运行得非常快。

标签: r


【解决方案1】:

只要做:

as.Date(dates, format = "%m/%d/%Y")
  1. 您不需要循环遍历dates 向量,因为as.Date() 可以一次性处理字符向量。您的函数会引发对 as.Date()length(dates) 调用以及对其他函数的一些分配,这些都具有完全不必要的开销。
  2. 您不想将每个单独的日期转换为一个因子。您根本不想转换它们(as.Date() 只会将它们转换回字符)。如果您确实想转换它们,factor() 也是矢量化的,所以你可以(但你不需要这个在你的函数中的任何地方)删除factor() 行并在for() 循环之外插入dates &lt;- as.factor(dates) 。但同样,您根本不需要这样做!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多