I'm trying to write a function that takes a vector of length n and then takes the first value of the vector i.e j=1 and forms a new vector of length n (i.e replicate the first value n times). This function will then calculate the absoulte difference of the original vector and the new vector and store the results omitting the difference between the value and itself. This function should be able to repeat the procedure for each of the j's i.e j=2 to n. The results should all be stored together. Below is what I've tried so far but it seems to work only for j=1 . Your help will be highly appreciated. IED<-function(risk){ n<-length(risk) i<-c(1:n) Diff<-numeric() for(j in 1:n){ relrisk<-risk relrisk[i]<-relrisk[j] Difference<-abs(risk-relrisk) Difference<-Difference[-c(1:j)] Difference<-append(Diff,Difference) return(Difference) } } Oarabile
On Tue, 13 Dec 2005, Oarabile Molaodi wrote:> I'm trying to write a function that takes a vector of length n and then > takes the first value of the vector i.e j=1 and forms a new vector of > length n (i.e replicate the first value n times). This function will > then calculate the absoulte difference of the original vector and the > new vector and store the results omitting the difference between the > value and itself. This function should be able to repeat the procedure > for each of the j's i.e j=2 to n. The results should all be stored > together. Below is what I've tried so far but it seems to work only for > j=1 . > > Your help will be highly appreciated. > IED<-function(risk){ > n<-length(risk) > i<-c(1:n) > Diff<-numeric() > for(j in 1:n){ > relrisk<-risk > relrisk[i]<-relrisk[j] > Difference<-abs(risk-relrisk) > Difference<-Difference[-c(1:j)] > Difference<-append(Diff,Difference) > return(Difference) > } > }How about "IED" <- function(risk){ n<-length(risk) Diff<-numeric(n) for(j in 1:n){ relrisk<-rep(risk[j],n) Diff[j]<-sum(abs(risk-relrisk)[-j]) } Diff } -- Robert Burrows, PhD New England Biometrics rbb at nebiometrics.com
Does this do what you want: IED <- function(risk){ tmp <- outer(risk,risk,"-") tmp <- abs(tmp) return(tmp[lower.tri(tmp)]) } -- Gregory L. Snow Ph.D. Statistical Data Center, IHC greg.snow at intermountainmail.org (801) 408-8111> -----Original Message----- > From: r-help-bounces at stat.math.ethz.ch > [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of > Oarabile Molaodi > Sent: Tuesday, December 13, 2005 5:00 AM > To: r-help at stat.math.ethz.ch > Subject: [R] help with writing function > > I'm trying to write a function that takes a vector of length > n and then takes the first value of the vector i.e j=1 and > forms a new vector of length n (i.e replicate the first value > n times). This function will then calculate the absoulte > difference of the original vector and the new vector and > store the results omitting the difference between the value > and itself. This function should be able to repeat the > procedure for each of the j's i.e j=2 to n. The results > should all be stored together. Below is what I've tried so > far but it seems to work only for > j=1 . > > Your help will be highly appreciated. > IED<-function(risk){ > n<-length(risk) > i<-c(1:n) > Diff<-numeric() > for(j in 1:n){ > relrisk<-risk > relrisk[i]<-relrisk[j] > Difference<-abs(risk-relrisk) > Difference<-Difference[-c(1:j)] > Difference<-append(Diff,Difference) > return(Difference) > } > } > > > Oarabile > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html >
Hi or use outer x<-1:10 x<-sample(x) mat<-outer(x,x,"-") # result with zeroes matrix(mat[!mat==0],9,9) # get rid of them will give you a matrix with columns with intended result. HTH Petr On 13 Dec 2005 at 11:53, Robert Burrows wrote: Date sent: Tue, 13 Dec 2005 11:53:00 -0500 (EST) From: Robert Burrows <rbb at nebiometrics.com> To: Oarabile Molaodi <oarabile at stams.strath.ac.uk> Copies to: r-help at stat.math.ethz.ch Subject: Re: [R] help with writing function> On Tue, 13 Dec 2005, Oarabile Molaodi wrote: > > > I'm trying to write a function that takes a vector of length n and > > then takes the first value of the vector i.e j=1 and forms a new > > vector of length n (i.e replicate the first value n times). This > > function will then calculate the absoulte difference of the original > > vector and the new vector and store the results omitting the > > difference between the value and itself. This function should be > > able to repeat the procedure for each of the j's i.e j=2 to n. The > > results should all be stored together. Below is what I've tried so > > far but it seems to work only for j=1 . > > > > Your help will be highly appreciated. > > IED<-function(risk){ > > n<-length(risk) > > i<-c(1:n) > > Diff<-numeric() > > for(j in 1:n){ > > relrisk<-risk > > relrisk[i]<-relrisk[j] > > Difference<-abs(risk-relrisk) > > Difference<-Difference[-c(1:j)] > > Difference<-append(Diff,Difference) > > return(Difference) > > } > > } > > How about > > "IED" <- > function(risk){ > n<-length(risk) > Diff<-numeric(n) > for(j in 1:n){ > relrisk<-rep(risk[j],n) > Diff[j]<-sum(abs(risk-relrisk)[-j]) > } > Diff > } > > -- > Robert Burrows, PhD > New England Biometrics > rbb at nebiometrics.com > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.htmlPetr Pikal petr.pikal at precheza.cz