Dear Dennins,
Many thanks for you reply. Sorry for the convoluted loops, but I am starting to
learn some programming and the loops are a bit complicated for me. Finally, a
collegue help me with the code, and one code that works is like follow:
Pma-rep (1:40)
P-seq(1,4, 1)
Plot-rep(P,10)
dbh2-rnorm(40, mean=200, sd=5)
SBA2-rnorm(40, mean=10, sd=1)
BAL2-rep(0,length(Pma))
data-data.frame(Pma,Plot,dbh2,SBA2,BAL2)
for (p in 1:length(unique(Plot))){
index.stand-which(data$Plot==p)
data.aux-data[ index.stand , ]
result.aux-numeric()
for (i in 1:length(data.aux$Pma)){
result.aux[i] -sum(data.aux$SBA2[which(data.aux$dbh2 data.aux[i ,
]$dbh2)]) }
data$BAL2[ index.stand]-result.aux
rm(data.aux)
rm(result.aux)
}
data
Best,
Paloma
Date: Thu, 21 Jul 2011 14:18:37 -0700
Subject: Re: [R] nested loop for
From: djmu...@gmail.com
To: paloma_...@hotmail.com
CC: r-help@r-project.org
Hi:
I *think* this is what you're after, but I get dizzy trying to read
convoluted loops. Try this instead;
# Function to find the total SBA2 for all dbh2 larger than the given one:
foo - function(d) {
d - d[order(d$dbh2), ]
d - transform(d, BAL2 = sum(SBA2) - cumsum(SBA2))
d
}
library('plyr')
ddply(kk, .(Plot), foo)
Pma Plot dbh2 SBA2 BAL2
1 291 185.8568 9.055821 91.530165
2 331 186.4623 10.762347 80.767818
311 192.8324 10.741988 70.025830
4 171 196.2093 9.484601 60.541229
5 211 204.0971 11.389817 49.151412
6 131 204.5070 9.644655 39.506756
791 205.3079 11.014892 28.491864
8 251 206.5908 10.041878 18.449986
951 206.8110 8.602678 9.847307
10 371 211.1735 9.847307 0.00
...
# If you want the groupwise sum in the output, use the following
version instead:
foo - function(d) {
d - d[order(d$dbh2), ]
d - transform(d, BAL2 = sum(SBA2) - cumsum(SBA2),
aa = sum(SBA2))
d
}
HTH,
Dennis
On Thu, Jul 21, 2011 at 4:13 AM, paloma ruiz benito
paloma_...@hotmail.com wrote:
Hi everyone,
I have been working some days in a nested loop in R but I can't find the
solution.
I have a data.frame with an unique ID for individuals and unique ID for
different stands, for each indiviadual I have a dbh record and a SBA (stand
basal area) field.
Pma-rep (1:40)
P-seq(1,4, 1)
Plot-rep(P,10)
dbh2-rnorm(40, mean=200, sd=5)
SBA2-rnorm(40, mean=10, sd=1)
As I want to calculate the basal area of larger trees in each stand (i.e.,
the compare tree to tree the dbh and for each individual sum the stand
basal area of larger trees)
BAL2-rep(0,length(Pma))
aa-rep(0,length(Pma))
Now I have programed a for loop to do this calculation, and one plot it
works quite well:
kk-data.frame(Pma, Plot, dbh2, SBA2, BAL2, aa)
kkk-kk[kk$Plot==1,]
The loop:
for(j in 1:length(kkk$Pma)){
for(i in 1:length(kkk$Pma)){
if(kkk$dbh2[j]kkk$dbh2[i])
kkk$aa[i]-kkk$SBA2[i]
else temp_data$aa[i]-0
kkk$BAL2[j]-sum(kkk$aa)
}
}
But, I have tried a million of forms to calculate this for each stand...
and no one looks fine. The closest code that I have got is:
for(k in 1:length(kk)){
temp_data-kk[kk$Plot==Plot[k],]
for(j in 1:length(temp_data$Pma)){
#I have selected the individuals to calculate the BAL in each plot
for(i in 1:length(temp_data$Pma)){
if(temp_data$dbh2[j]temp_data$dbh2[i])
temp_data$aa[i]-temp_data$SBA2[i]
else temp_data$aa[i]-0
temp_data$BAL2[j]-sum(temp_data$aa)
}
###Some suggestion to save the temporal data of each stand and group
it together
}
}
Any advise or suggestion will be very welcome,
Thanks in advance,
Paloma
[[alternative HTML version deleted]]
__
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.
[[alternative HTML version deleted]]
__
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.