def row_at *positions
      original_positions = positions
      positions = coerce_positions(*positions, nrows)
      validate_positions(*positions, nrows)

      if positions.is_a? Integer
        row = get_rows_for([positions])
        Daru::Vector.new row, index: @vectors
      else
        new_rows = get_rows_for(original_positions)
        Daru::DataFrame.new new_rows, index: @index.at(*original_positions), order: @vectors
      end
    end
def row_at *positions
      original_positions = positions
      positions = coerce_positions(*positions, nrows)
      validate_positions(*positions, nrows)

      if positions.is_a? Integer
        row = get_rows_for([positions])
        Daru::Vector.new row, index: @vectors
      else
        new_rows = get_rows_for(original_positions)
        Daru::DataFrame.new new_rows, index: @index.at(*original_positions), order: @vectors
      end
    end
Retrive rows by positions
 @param [Array<Integer>] positions of rows to retrive
 @return [Daru::Vector, Daru::DataFrame] vector for single position and dataframe for multiple positions
 @example
   df = Daru::DataFrame.new({
     a: [1, 2, 3],
     b: ['a', 'b', 'c']
   })
   df.row_at 1, 2
   # => #<Daru::DataFrame(2x2)>
   #       a   b
   #   1   2   b
   #   2   3   c