Jonas Sundberg
2010-Sep-27 08:43 UTC
[R] make changes in existing vector with the apply function?
Hi, I'm trying to make some changes in a vector according to some conditions. It takes too long time however with vector length > 100000 and I guess a better way would be using the apply function. I cannot sort out how, however. As a for/if loop: for (i in 1:length(PrH)) { if (is.finite(PrH[i]) == F & tempHER > tempSPR) {PrH[i] <- 1 } if (is.finite(PrH[i]) == F & tempHER < tempSPR) {PrH[i] <- 0 }} PrH, tempSPR and tempHER are equally long vectors. Thanks in advance!Jonas [[alternative HTML version deleted]]
William Dunlap
2010-Sep-27 16:08 UTC
[R] make changes in existing vector with the apply function?
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Jonas Sundberg > Sent: Monday, September 27, 2010 1:43 AM > To: r-help at r-project.org > Subject: [R] make changes in existing vector with the apply function? > > > Hi,?I'm trying to make some changes in a vector according to > some conditions. It takes too long time however with vector > length > 100000 and I guess a better way would be using the > apply function. I cannot sort out how, however.? > As a for/if loop: > for (i in 1:length(PrH)) { > if (is.finite(PrH[i]) == F & tempHER > tempSPR) {PrH[i] <- 1 } > if (is.finite(PrH[i]) == F & tempHER < tempSPR) {PrH[i] <- 0 }} > PrH, tempSPR and tempHER are equally long vectors.?Did that code ever work? I would have thought that your tempHER and tempSPR would require a [i] after them. (Otherwise you would get warnings and incorrect results.) If so, a first step is to replace your for loop with PrH[!is.finite(PrH) & tempHER>tempSPR] <- 1 PrH[!is.finite(PrH) & tempHER<tempSPR] <- 0 Read the '[' as 'such that' when using logical-valued subscripts. If time or memory is at a premium you may get slightly better mileage from more complicated code. E.g., in the following we compute is.inite(PrH) only once and use the fact that as.integer maps TRUE and FALSE to 1 and 0, respectively: PrHIsInfinite <- !is.finite(PrH) PrH[PrHIsInfinite] <- as.integer(tempHER[PrHIsInfinite]>tempSPR[PrHIsInfinite]) I haven't tested any of this. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> Thanks in advance!Jonas > > > > [[alternative HTML version deleted]] > >