title: Randomly split data by criterion into training and testing data set using R
body: <p>Gidday,</p>
  
  <p>I'm looking for a way to randomly split a data frame (e.g. 90/10 split) for testing and training of a model keeping a certain grouping criteria. </p>
  
  <p>Imagine I have a data frame like this:</p>
  
  <pre><code>&gt; test[1:20,]
                  companycode     year    expenses         
      1                 C1          1     8.47720                 
      2                 C1          2     8.45250                 
      3                 C1          3     8.46280                 
      4                 C2          1 14828.90603                 
      5                 C3          1   665.21565                 
      6                 C3          2   290.66596                 
      7                 C3          3   865.56265                 
      8                 C3          4   6785.03586                
      9                 C3          5   312.02617                 
      10                C3          6   760.48740               
      11                C3          7  1155.76758                
      12                C4          1  4565.78313                 
      13                C4          2  3340.36540                 
      14                C4          3  2656.73030                 
      15                C4          4  1079.46098                 
      16                C5          1    60.57039                 
      17                C6          1  6282.48118                 
      18                C6          2  7419.32720                 
      19                C7          1   644.90571                 
      20                C8          1 58332.34945   
  </code></pre>
  
  <p>What I'm trying to do is to split this data frame into a training and a testing set using a defined splitting criterion. Using the provided data, I want to split the data in a way that the companies are not mixed up in both data frames. Data set 1 contains different companies than data set 2.</p>
  
  <p>Imagine a 90/10 split, an ideal split would look like this:</p>
  
  <pre><code>&gt; data_90split
  
             companycode     year    expenses         
  
          4                 C2          1 14828.90603                                 
          12                C4          1  4565.78313                 
          13                C4          2  3340.36540                 
          14                C4          3  2656.73030                 
          15                C4          4  1079.46098                 
          16                C5          1    60.57039
          5                 C3          1   665.21565                 
          6                 C3          2   290.66596                 
          7                 C3          3   865.56265                 
          8                 C3          4   6785.03586                
          9                 C3          5   312.02617                 
          10                C3          6   760.48740               
          11                C3          7  1155.76758                 
          17                C6          1  6282.48118                 
          18                C6          2  7419.32720
          1                 C1          1     8.47720                 
          2                 C1          2     8.45250                 
          3                 C1          3     8.46280
  
  
  
   &gt; data_10split
                      companycode     year   expenses
          20                C8          1 58332.34945 
          19                C7          1   644.90571  
  </code></pre>
  
  <p>I hope I pointed out clearly what I'm looking for. 
  Thanks for your feedback.           </p>