[R] Put one random row dataset to first cell variable

Jim Lemon bitwrit at ozemail.com.au
Wed Apr 20 13:53:28 CEST 2005


Jan Sabee wrote:
> Dear useR help,
> This is below my toy dataset,
> 
>    age married income gender
>  young      no    low female
>    old     yes    low female
>    mid      no   high female
>  young     yes   high female
>    mid     yes   high female
>    mid      no medium female
>    old      no medium female
>  young     yes medium female
>    mid     yes    low   male
>    old     yes    low   male
>  young      no   high   male
>    old      no   high   male
>    mid     yes   high   male
>  young     yes medium   male
>    old     yes medium   male
> 
> and I take one random row (young,no,low,female) then I make like this
>  
>   age       <- c("young","mid","old")
>   married   <- c("no","yes")
>   income    <- c("low","high","medium")
>   gender    <- c("female","male")
> 
> then I take one random row again (mid,yes,high,male), now
> 
>   age       <- c("mid","young","old")
>   married   <- c("yes","no")
>   income    <- c("high","low","medium")
>   gender    <- c("male","female")
> 
> and etc, each I take one random row I put in the first cell in each
> own variable.
> Is this possible to make a simple function?
> 
Assumptions:
1) the object is a data frame.
2) all variables are factors (although I have CMA).
3) you want a list containing vectors of the levels for each value in 
which the first level is the value in that row.

order.levels<-function(dfrow) {
  nvars<-dim(dfrow)[2]
  lslist<-sapply(dfrow,levels)
  for(i in 1:nvars) {
   if(is.factor(dfrow[,i])) {
    levelstrings<-levels(dfrow[1,i])
    whichlevel<-which(levelstrings==dfrow[1,i])
    lslist[[i]]<-c(levelstrings[whichlevel],levelstrings[-whichlevel])
   }
  }
  return(lslist)
}

Say your data frame is called toy.df:

nrows<-dim(toy.df)[1]
order.levels(toy.df[sample(1:nrows,1),])

Whether this is simple is debatable.

Jim




More information about the R-help mailing list