如何矢量化函数?

时间:2013-09-12 14:58:32

标签: r vectorization

如何对此功能进行矢量化?

difftime2string <- function (x) {
  if (abs(x) < 1) return(sprintf("%.2fms",x*1000))
  if (abs(x) < 100) return(sprintf("%.2fsec",x))
  if (abs(x) < 6000) return(sprintf("%.2fmin",x/60))
  if (abs(x) < 108000) return(sprintf("%.2fhrs",x/3600))
  if (abs(x) < 400*24*3600) return(sprintf("%.2fdays",x/(24*3600)))
  sprintf("%.2fyears",x/(365.25*24*3600))
}

编辑:我的意思是没有Vectorize - 我如何用很多if来编写矢量化代码。

2 个答案:

答案 0 :(得分:13)

difftime2string <- function(x) {
    breaks <- c(0, 1, 100, 6000, 108000, 400*24*3600, Inf)
    units <- c("ms", "sec", "min", "hrs", "days", "years")
    fact <- c(1000, 1, 1/60, 1/3600, 1/(24*3600), 1/(365.25*24*3600))
    ii <- findInterval(x, breaks)
    sprintf(paste0("%.2f", units[ii]), x*fact[ii])
}

x <- c(.1, 2, 200, 6001, 109000, 500*24*3600)
difftime2string(x)
# [1] "100.00ms"  "2.00sec"   "3.33min"   "1.67hrs"   "1.26days"  "1.37years"

答案 1 :(得分:9)

在没有考虑的情况下做这样的事情最简单的方法就是使用Vectorize

difftime2stringVect <- Vectorize(difftime2string)