How to vectorize the following loop code?

#1
I have the following code

Code:
for(i in 1:400)
  {
    if (mydata$quad[i]==1){
      
      mydata$z[i]=rnorm(n=sum(mydata$quad[i]==1),mean=1,1) 
    } else
      if (mydata$quad[i]==2){
        
        mydata$z[i]=rnorm(n=sum(mydata$quad[i]==2),mean=9,1) 
      } else
        if (mydata$quad[i]==3){
          
          mydata$z[i]=rnorm(n=sum(mydata$quad[i]==3),mean=6,1)
        }    else
          if (mydata$quad[i]==4){
            
            mydata$z[i]=rnorm(n=sum(mydata$quad[i]==4),mean=4,1)
          }else
            if (mydata$quad[i]==5){
              
              mydata$z[i]=rnorm(n=sum(mydata$quad[i]==5),mean=1,1)
            }else
              if (mydata$quad[i]==6){
                
                mydata$z[i]=rnorm(n=sum(mydata$quad[i]==6),mean=0,1)
              }else
                if (mydata$quad[i]==7){
                  
                  mydata$z[i]=rnorm(n=sum(mydata$quad[i]==7),mean=0,1)
                  
                }else
                  if (mydata$quad[i]==8){
                    
                    mydata$z[i]=rnorm(n=sum(mydata$quad[i]==8),mean=2,1)
                  }else
                    if (mydata$quad[i]==9){
                      
                      mydata$z[i]=rnorm(n=sum(mydata$quad[i]==9),mean=6,1)
                      
                    }}
and I would like to vectorize the code maybe using ifelse statement how can I do that?
 

Dason

Ambassador to the humans
#2
No need for any if or ifelse statement. If the only thing is different I'd the man it's easy enough to just generate standard normal observations and then add the mean for each observation later. That adding part can easily be done using indexing.
 

Dason

Ambassador to the humans
#4
Code:
# Generate fake data
mydata <- data.frame(quad = sample(1:9, 400, replace = T))

means <- c(1,9,6,4,1,0,0,2,6)
# this works since quad is just 1-9
mydata$means <- means[mydata$quad]

# rnorm can take a different mean for each obseration
# so we just match up the mean we want for each row...
mydata$z <- rnorm(nrow(mydata), mean = mydata$means, 1)
# If you didn't want to create the mydata$means column
mydata$z2 <- rnorm(nrow(mydata), mean = means[mydata$quad], 1)
# If you wanted to just add on the means later
mydata$z3 <- rnorm(nrow(mydata), 0, 1)
mydata$z3 <- mydata$z3 + mydata$means
 

Dason

Ambassador to the humans
#6
Note that I'm making the assumption that you assigning multiple values to a single row was an error in your code. I don't think you should have been using things like "n=sum(mydata$quad==3)" in your rnorm call since you're assigning to the single value mydata$z