On 13-Jan-09 13:20:54, Niccolò Bassani wrote: > Dear R users,I come to you with a quite silly question I think, > but I hope you can answer me... > That is, I've got some problems in using the if and while conditions > in a loop. > Substantially, I want to select rows in a dataset depending on an > index variable (suppose it ranges from 1 to 5), so to make a specific > analysis (homemade of course) on thie new dataset. Mi first tought > has been to do a double loop like this: > > for i in 1:5{ > for j in (i+1):5{ > data = dataset[(variable==i) | (variable==j),] >##analysis >##analysis > } > } > > This way I should select all the couples only once (gaining in > efficiency I hope). The fact is that this arrangement has a problem: > that j ends up with ranging from 2 to 6, not from to 2 to 5. So when > I do a subsetting on the dataset to obtain only the rows corresponding > to the values of i and j I want, when the loop comes to j = 6 I have > an error, of course. > What I want to know is: how can I use the if or while condition in such > a loop to avoid the routine doing the computations for this case? > I.e., can I tell somehow R "Hey, if j=6, let it go and move on with > the other computations"? > Or maybe you can see a faster and better way of using the for > conditions?? > > I hope I made myself clear, if not I'll carify myself!! > > Thanks in advance > Niccolò
Presumably the foloowing summarises the situation you want to avoid: for(i in (1:5)){for(j in ((i+1):5)){ print(c(i,j))}} # [1] 1 2 # [1] 1 3 # [1] 1 4 # [1] 1 5 # [1] 2 3 # [1] 2 4 # [1] 2 5 # [1] 3 4 # [1] 3 5 # [1] 4 5 # [1] 5 6 # [1] 5 5 I.e. you get (5,6) when case 6 is not wanted. If (as seems likely) you don't want (5,5) either (i.e. you only want all pairs (i,j) from 1:5 with i<j), then the following does it: for(i in (1:4)){for(j in ((i+1):5)){ print(c(i,j))}} # [1] 1 2 # [1] 1 3 # [1] 1 4 # [1] 1 5 # [1] 2 3 # [1] 2 4 # [1] 2 5 # [1] 3 4 # [1] 3 5 # [1] 4 5 However, if for some reason you do want (5,5) as well, then: for(i in (1:5)){for(j in (min(5,(i+1)):5)){ print(c(i,j))}} # [1] 1 2 # [1] 1 3 # [1] 1 4 # [1] 1 5 # [1] 2 3 # [1] 2 4 # [1] 2 5 # [1] 3 4 # [1] 3 5 # [1] 4 5 # [1] 5 5 Also (though I suspect it was simply due to hasty typing), the syntax of what you wrote above: for i in 1:5{ for j in (i+1):5{ ... } } will not work, since you must write "for( ... )" and not "for ... ": for i in (1:5) # Error: unexpected symbol in "for i" Hoping this helps, Ted. -------------------------------------------------------------------- E-Mail: (Ted Harding) <ted.hard...@manchester.ac.uk> Fax-to-email: +44 (0)870 094 0861 Date: 13-Jan-09 Time: 15:09:58 ------------------------------ XFMail ------------------------------ ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.