code: def add_dimension(self, dimension, dim_pos, dim_val, vdim=False, **kwargs):
          
          dimension = asdim(dimension)
  
          if dimension in self.dimensions():
              raise Exception('{dim} dimension already defined'.format(dim=dimension.name))
  
          if vdim and self._deep_indexable:
              raise Exception('Cannot add value dimension to object that is deep indexable')
  
          if vdim:
              dims = self.vdims[:]
              dims.insert(dim_pos, dimension)
              dimensions = dict(vdims=dims)
              dim_pos += self.ndims
          else:
              dims = self.kdims[:]
              dims.insert(dim_pos, dimension)
              dimensions = dict(kdims=dims)
  
          if isinstance(dim_val, basestring) or not hasattr(dim_val, '__iter__'):
              dim_val = cycle([dim_val])
          else:
              if not len(dim_val) == len(self):
                  raise ValueError("Added dimension values must be same length"
                                   "as existing keys.")
  
          items = OrderedDict()
          for dval, (key, val) in zip(dim_val, self.data.items()):
              if vdim:
                  new_val = list(val)
                  new_val.insert(dim_pos, dval)
                  items[key] = tuple(new_val)
              else:
                  new_key = list(key)
                  new_key.insert(dim_pos, dval)
                  items[tuple(new_key)] = val
  
          return self.clone(items, **dict(dimensions, **kwargs))
docs: Adds a dimension and its values to the object
  
          Requires the dimension name or object, the desired position in
          the key dimensions and a key value scalar or sequence of the
          same length as the existing keys.
  
          Args:
              dimension: Dimension or dimension spec to add
              dim_pos (int) Integer index to insert dimension at
              dim_val (scalar or ndarray): Dimension value(s) to add
              vdim: Disabled, this type does not have value dimensions
              **kwargs: Keyword arguments passed to the cloned element
  
          Returns:
              Cloned object containing the new dimension