[R] ifelse command

Joshua Wiley jwiley.psych at gmail.com
Wed Aug 18 12:31:14 CEST 2010


Dear Philip,

Trying to use 5 nested ifelse() statements will not be the same as a
series of if statements, and will also be quite messy.

Also, consider these lines of your code:

x <- sample(1:6,n,replace=TRUE,prob=c(1,1,2,3,2,1)/10)
x = runif(n)

First you assign n samples of 1:6 to 'x', then you immediately
overwrite 'x' with 1000 random samples from the uniform distribution.
If you try your function after removing the x <- sample.... line, you
will find it does nothing (well, it does make the process take
somewhat longer).

On another note, after you 'succeeded' with the if statements, did you
look at the 50+ warnings?  These should have cued you in that
something might have been going wrong.  Look at the following:


set.seed(1)
x <- runif(3)
y <- x # assign a copy of 'x' to 'y'
x

ifelse(1 < 2, {x[1] = 999}, {x[1] = 888} )

ifelse(c(1, 3) < 2, {x[2] = 999}, {x[2] = 888} )

ifelse(c(3, 1) < 2, {x[3] = 999}, {x[3] = 888} )

if(1 < 2) {y[1] = 999} else {y[1] = 888}

if(c(1, 3) < 2) {y[2] = 999} else {y[2] = 888}

if(c(3, 1) < 2) {y[3] = 999} else {y[3] = 888}

# Note the warnings() from using if statements
# and that x and y are not equal
x
y

I think you are looking for:

dat <- sample(1:6, 1000, prob = c(1, 1, 2, 3, 2, 1)/10, replace = TRUE)
barplot(table(dat))

If you really want to see the results after running that 1000 times, perhaps....

datbig <- sample(1:6, 1000*1000, prob = c(1, 1, 2, 3, 2, 1)/10, replace = TRUE)
barplot(table(datbig))

HTH,

Josh

On Wed, Aug 18, 2010 at 2:18 AM, Philip Wong <tombfighter at mysinamail.com> wrote:
>
> hello people,
> I want to make a biased dice using the sample() function and print out the
> results after n number of runs, I've successfully generated the dice using
> the following command:
> mydie2<-function(n=1000,y=NULL,...){
> for(i in 1:n){
> x<-sample(1:6,n,replace=TRUE,prob=c(1,1,2,3,2,1)/10)
> x=runif(n)
> if(x<=1/10){y[i]=1}
> else if(x<=2/10){y[i]=2}
> else if(x<=4/10){y[i]=3}
> else if(x<=7/10){y[i]=4}
> else if(x<=9/10){y[i]=5}
> else{y[i]=6}
> }
> bar<-barplot(table(y))
> table<-table(y)
> return(list(bar,table))
> }
>
> mydie2()
>
>
> but I also want to try to create the same dice stimulation using ifelse()
> statement, but all hell break loose when I attempt to use the command below
> (the barplot only shows the results to be 6), can anyone tell me what went
> wrong please:
> mydie2<-function(n=1000,y=NULL,...){
> for(i in 1:n){
> x<-sample(1:6,n,replace=TRUE,prob=c(1,1,2,3,2,1)/10)
> x=runif(n)
> ifelse((x<=1/10),{y[i]<-1},
> ifelse((x<=2/10),{y[i]<-2},
> ifelse((x<=4/10),{y[i]<-3},
> ifelse((x<=7/10),{y[i]<-4},
> ifelse((x<=9/10),{y[i]<-5},{y[i]<-6})))))
>
> }
> bar<-barplot(table(y))
> table<-table(y)
> return(list(bar,table))
> }
>
>
> mydie2()
> --
> View this message in context: http://r.789695.n4.nabble.com/ifelse-command-tp2329538p2329538.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help at 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.
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/



More information about the R-help mailing list