[R] index instead of loop?

Rui Barradas rui1174 at sapo.pt
Tue Mar 6 03:48:54 CET 2012


Hello,

> 
> Mar 05, 2012; 8:53pm — by Ben quant Ben quant
> Hello,
> 
> Does anyone know of a way I can speed this up? 
> 

Maybe, let's see.

>
> ################################# change anything below.
>

# Yes.
# First, start by using dates, not characters

fdate <- function(x, format="%Y%m%d"){
	DF <- data.frame(x)
	for(i in colnames(DF)){
		DF[, i] <- as.Date(DF[, i], format=format)
		class(DF[, i]) <- "Date"
	}
	DF
}

rd1 <- fdate(rd1)
# This is yours, use it.
dt1 <- seq(from =as.Date(z.dates[1]), to = as.Date("2009-03-25"), by =
"day")
# Set up the result, no time expensive 'cbind' inside a loop
fin1 <- data.frame(matrix(NA, nrow=length(dt1), ncol=ncol(ua) + 1))
fin1[, 1] <- dt1
nr <- nrow(rd1)

# And vectorize
for(tkr in 1:ncol(ua)){
	x  <- c(rd1[, tkr], as.Date("9999-12-31"))
	inxlist <- lapply(1:nr, function(i) which(x[i] <= dt1 & dt1 < x[i + 1]))
	sapply(1:length(inxlist), function(i) if(length(ix[[i]])) fin1[ix[[i]], tkr
+ 1] <<- ua[i, tkr])
}
colnames(fin1) <- c("daily_dates", colnames(ua))

# Check results
str(fin)
str(fin1)
head(fin)
head(fin1)
tail(fin)
tail(fin1)


Note that 'fin' has facotrs, 'fin1' numerics.
I haven't timed it but I believe it should be faster.

Hope this helps,

Rui Barradas





--
View this message in context: http://r.789695.n4.nabble.com/index-instead-of-loop-tp4447672p4448567.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list