R: Split Data into Test and Train Set

sample.split {caTools} | R Documentation

## Split Data into Test and Train Set

### Description

Split data from vector Y into two sets in predefined ratio while preserving relative ratios of different labels in Y. Used to split the data used during classification into train and test subsets.

### Usage

     sample.split( Y, SplitRatio = 2/3, group = NULL )

### Arguments

`Y` | Vector of data labels. If there are only a few labels (as is expected) than relative ratio of data in both subsets will be the same.
`SplitRatio` | Splitting ratio: if `(0<=SplitRatio<1)` then `SplitRatio` fraction of points from Y will be set toTRUE if `(SplitRatio==1)` then one random point from Y will be set to TRUE if `(SplitRatio>1)` then `SplitRatio` number of points from Y will be set to TRUE
`group` | Optional vector/list used when multiple copies of each sample are present. In such a case `group` contains unique sample labels, marking all copies of the same sample with the same label, and the function tries to place all copies in either train or test subset. If provided than has to have the same length as `Y`.

### Details

Function `msc.sample.split` is the old name of the `sample.split` function. To be retired soon.

### Value

Returns logical vector of the same length as Y with random `SplitRatio*length(Y)` elements set to TRUE.

### Author(s)

Jarek Tuszynski (SAIC) jaroslaw.w.tuszynski@saic.com

### See Also

- Similar to `sample` function.

- Variable `group` is used in the same way as `f` argument in `split` and `INDEX` argument in `tapply`

### Examples

      library(MASS)
      data(cats)   # load cats data
      Y = cats[,1] # extract labels from the data
      msk = sample.split(Y, SplitRatio=3/4)
      table(Y,msk)
      t=sum( msk)  # number of elements in one class
      f=sum(!msk)  # number of elements in the other class
      stopifnot( round((t+f)*3/4) == t ) # test ratios

      # example of using group variable
      g = rep(seq(length(Y)/4), each=4); g[48]=12;
      msk = sample.split(Y, SplitRatio=1/2, group=g)
      table(Y,msk) # try to get correct split ratios ...
      split(msk,g) # ... while keeping samples with the same group label together

      # test results
      print(paste( "All Labels numbers: total=",t+f,", train=",t,", test=",f,
            ", ratio=", t/(t+f) ) )
      U = unique(Y)       # extract all unique labels
      for( i in 1:length(U)) {  # check for all labels
        lab = (Y==U[i])   # mask elements that have label U[i]
        t=sum( msk[lab])  # number of elements with label U[i] in one class
        f=sum(!msk[lab])  # number of elements with label U[i] in the other class
        print(paste( "Label",U[i],"numbers: total=",t+f,", train=",t,", test=",f,
                     ", ratio=", t/(t+f) ) )
      }

      # use results
      train = cats[ msk,2:3]  # use output of sample.split to ...
      test  = cats[!msk,2:3]  # create train and test subsets
      z = lda(train, Y[msk])  # perform classification
      table(predict(z, test)$class, Y[!msk]) # predicted & true labels

      # see also LogitBoost example

[Package caTools version 1.17.1.1 Index]