Dear all,

I know there have been various questions posted over the years about loops but 
I'm afraid that I'm still stuck.  I am using Windows XP and R 2.9.2.
I am generating some data using the multivariate normal distribution (within 
the 'mnormt' package). [The numerical values of sanad and covmat are not 
important.]
> datamat <- 
> rmnorm(n=1500,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)

The middle column of 'datamat' is simulated data for age.  Obviously some of 
the simulated values are not going to be sensible.  Therefore I'd like to set 
up a function that looks at each row of 'datamat' and if the value for the 
middle column is <5 or >86 then the whole row is replaced by another imputed 
row.  Of course, the problem is that the imputed value for age may be outside 
my acceptable range too.

If there a way to set up a loop such that it keeps checking each row until  the 
values are within the range?

So far I have the following but this doesn't repeat the process.
ctstrunk <- function(data)
                {
                for(i in 1:nrow(data)){
                if(data[i,2]<5)
                
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                if(data[i,2]>86)
                
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                }
                return(data)
                }

I thought of perhaps a repeat loop such as the following but this loop never 
stops...
ctstrunk <- function(data)
                {
                repeat{
for(i in 1:nrow(data)){
                if(data[i,2]<5)
                
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                if(data[i,2]>5){break}
                }
                repeat{
for(i in 1:nrow(data)){
                if(data[i,2]>86)
                
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                if(data[i,2]<86){break}
                }
                return(data)
                }

I have also tried a while loop but again, the function didn't stop
ctstrunk <- function(data)
                {
                for(i in 1:nrow(data)){
                while(data[i,2]<5) 
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                while(data[i,2]>86) 
data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
                }
                return(data)
                }

Many thanks for any assistance you can offer.

Kind regards,
Laura

Laura Bonnett
Research Assistant
Department of Biostatistics
University of Liverpool

Telephone: 0151 7944059
Email: l.j.bonn...@liv.ac.uk


        [[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.

Reply via email to