# [R] Odp: For-loop

Petr PIKAL petr.pikal at precheza.cz
Mon Dec 20 14:23:50 CET 2010

```Hi

r-help-bounces at r-project.org napsal dne 20.12.2010 11:48:51:

> Hi,
> I have the following problem:
>
> I have a data.frame with 36 sample sites (colums) for which I have
covariates
> in 3 categories: Area, Month and River. Each Area consists of 3 rivers,
which
> were sampled over 3 month. Now I want to fuse River 1-3 for one area in
one
> month. To get a data.frame with 12 colums.
> I am trying to do a "for loop" (which may be a complicated solution, but
I
> don't see an easier way), which is not working, apparently because
a[,ij] or a
> [,c(i,j)] is not working as a definition of the matrix with a double
condition
> in the colums.
> How can  I make it work or what would be an easier solution?
>
> Thank you for your help,
> Anne
>
> data=data.frame(matrix(1:99,nrow=5,ncol=36))
> colnames(data)=c(paste("plot",1:36))
>
cov=data.frame(rep(1:3,12),c(rep("Jan",12),rep("Feb",12),rep("Mar",12)),rep(c
> (1,1,1,2,2,2,3,3,3,4,4,4),3))
> dimnames(cov)=list(colnames(data),c("River","Month","Area"))
>
> ###loop###
> a=matrix(nrow=dim(data)[1],ncol=length(levels(factor(cov\$Month)))*length
> (levels(factor(cov\$Area))))
>
>  for(i in 1:length(levels(factor(cov\$Month))))
>  {
>  for(j in 1:length(levels(factor(cov\$Area))))
>  {
>
a[,ij]=as.numeric(rowSums(data[,factor(cov\$Month)==levels(factor(cov\$Month))
> [i]&factor(cov\$Area)==levels(factor(cov\$Area))[j]]))
> }
> }

I am not exactly sure what you want to do. What operation is fuse? If it
is sum so having you data you can do

area<-rep(1:12, each=3)
data.t<-t(data)
> aggregate(data.t, list(area), sum)
Group.1  V1  V2  V3  V4  V5
1        1  18  21  24  27  30
2        2  63  66  69  72  75
3        3 108 111 114 117 120
4        4 153 156 159 162 165
5        5 198 201 204 207 210
6        6 243 246 249 252 255
7        7 189 192 195 198 102
8        8  36  39  42  45  48
9        9  81  84  87  90  93
10      10 126 129 132 135 138
11      11 171 174 177 180 183
12      12 216 219 222 225 228
> t(aggregate(data.t, list(area), sum))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
Group.1    1    2    3    4    5    6    7    8    9    10    11    12
V1        18   63  108  153  198  243  189   36   81   126   171   216
V2        21   66  111  156  201  246  192   39   84   129   174   219
V3        24   69  114  159  204  249  195   42   87   132   177   222
V4        27   72  117  162  207  252  198   45   90   135   180   225
V5        30   75  120  165  210  255  102   48   93   138   183   228

but then there is Month value, which is not apparent from your example.
Maybe

t(aggregate(data.t, list(area, data.t\$Month), sum))

Could do the trick but you probably need to show us maybe str and/or head

Regards
Petr

>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help