[R] Getting rid of for loops

Adrian DUSA adi at roda.ro
Mon Jul 17 17:48:19 CEST 2006


Hi again,

There is a slight error there, it should have been "marker2" at the fourth 
line:
all.pairs <- combn2(5:40)
marker1 <- names(qtl)[all.pairs[, 1]]
marker2 <- names(qtl)[all.pairs[, 2]]
myfun <- function(idx) {
    summary(aov(qtl$CPP ~ qtl[,idx[1]] * qtl[,idx[2]]))[[1]]$"Pr(>F)"[3])
    }
p.interaction <- apply(all.pairs, 1, myfun)

Actually, you don't need "as.matrix" there, just cbind all your vectors to 
obtain the final dataframe:

finally <- as.data.frame(cbind(marker1, marker2, p.interaction))

Adrian


On Monday 17 July 2006 18:40, Adrian DUSA wrote:
> Hi Kevin,
>
> Regarding your first question, try this:
>
> library(combinat)
> all.pairs <- combn2(5:40)
> marker1 <- as.matrix(names(qtl)[all.pairs[, 1]])
> marker1 <- as.matrix(names(qtl)[all.pairs[, 2]])
> myfun <- function(idx) {
>     summary(aov(qtl$CPP ~ qtl[,idx[1]] * qtl[,idx[2]]))[[1]]$"Pr(>F)"[3])
>     }
> p.interaction <- as.matrix(apply(all.pairs, 1, myfun)
>
> HTH,
> Adrian
>
> On Monday 17 July 2006 05:18, Kevin J Emerson wrote:
> > Hello R-users!
> >
> > I have a style question.  I know that for loops are somewhat frowned upon
> > in R, and I was trying to figure out a nice way to do something without
> > using loops, but figured that i could get it done quickly using them.  I
> > am now looking to see what kind of tricks I can use to make this code a
> > bit more aesthetically appealing to other R users (and learn something
> > about R along the way...).
> >
> > Here's the problem.  I have a data.frame with 4 columns of dependent
> > variables and then ~35 columns of predictor variables (factors) [for
> > those interested, it is a qtl problem, where the predictors are genotypes
> > at DNA markers and the dependent variable is a biological trait].  I want
> > to go through all pairwise combinations of predictor variables and
> > perform an anova with two predictors and their interaction on a given
> > dependent variable.  I then want to store the p.value of the interaction
> > term, along with the predictor variable information.  So I want to end up
> > with a dataframe at the end with the two variable names and the
> > interaction p value in each row, for all pairwise combinations of
> > predictors.  I used the following code:
> >
> > # qtl is the original data.frame, and my dependent var in this case is
> > # qtl$CPP.
> >
> > marker1 <- NULL
> > marker2 <- NULL
> > p.interaction <- NULL
> > for ( i in 5:40) {   # cols 5 - 41 are the predictor factors
> > 	for (j in (i+1):41) {
> > 		marker1 <- rbind(marker1,names(qtl)[i])
> > 		marker2 <- rbind(marker2,names(qtl)[j])
> > 		tmp2 <- summary(aov(tmp$CPP ~ tmp[,i] * tmp[,j]))[[1]]
> > 		p.interaction <- rbind(p.interaction, tmp2$"Pr(>F)"[3])
> > 	}
> > }
> >
> > I have two questions:
> > (1) is there a nicer way to do this without having to invoke for loops?
> > (2) my other dependent variables are categorical in nature.  I need
> > basically the same information - I am looking for information regarding
> > the interaction of predictors on a categorical variable.  Any ideas on
> > what tests to use? (I am new to analysis of all-categorical data).
> >
> > Thanks in advance!
> > Kevin
> >
> > --------------------------------------
> > --------------------------------------
> > Kevin Emerson
> > Center for Ecology and Evolutionary Biology
> > 1210 University of Oregon
> > Eugene, OR 97403
> > USA
> > kemerson at uoregon.edu

-- 
Adrian DUSA
Romanian Social Data Archive
1, Schitu Magureanu Bd
050025 Bucharest sector 5
Romania
Tel./Fax: +40 21 3126618 \
          +40 21 3120210 / int.101



More information about the R-help mailing list