class CADataFrameGroupMulti

Public Class Methods

new(dataframe, *names) click to toggle source
# File lib/carray-dataframe/group.rb, line 110
def initialize (dataframe, *names)
  @rank = names.size
  @dataframe = dataframe
  @names = []
  @column = []
  @keys = []
  names.each_with_index do |name, i|
    case name
    when Hash
      name, list = name.first
      @column[i] = @dataframe.col(name)
      @keys[i] = list.to_ca
    else
      @column[i] = @dataframe.col(name)
      @keys[i] = @column[i].to_ca.uniq.sort
    end
    @names[i] = name
  end
  @addrs = {}
  each_with_keys do |list|
    flag = @column[0].eq(list[0])
    (1...@rank).each do |i|
      flag &= @column[i].eq(list[i])
    end
    @addrs[list] = flag.where
  end
end

Public Instance Methods

[](group_value) click to toggle source
# File lib/carray-dataframe/group.rb, line 186
def [] (group_value)
  if map = @addrs[group_value]
    return @dataframe[map]
  else
    return @dataframe.vacant_copy
  end
end
calculate(label) { |name, clmn[addrs| ... } click to toggle source
# File lib/carray-dataframe/group.rb, line 165
    def calculate (label, &block)
new_columns = {@name=>@keys}
            @dataframe.each_column do |name, clmn|
  if name == @name
    next
  end
  new_columns[name] = CArray.object(@keys.size) { UNDEF }
  @keys.each_with_index do |k, i|
    begin
      if block
        new_columns[name][i] = yield(name, clmn[@addrs[k]])
      else
        new_columns[name][i] = clmn[@addrs[k]].send(label.intern)
      end
    rescue
    end
  end
end
return CADataFrame.new(new_columns)
    end
each() { |key, dataframe[addrs| ... } click to toggle source
# File lib/carray-dataframe/group.rb, line 194
def each
  each_with_keys do |key|
    yield key, @dataframe[@addrs[key]]
  end
end
each_with_keys(&block) click to toggle source
# File lib/carray-dataframe/group.rb, line 138
def each_with_keys (&block)
  @keys[0].to_a.product(*@keys[1..-1].map(&:to_a)).each(&block)
end
table(&block) click to toggle source
# File lib/carray-dataframe/group.rb, line 142
def table (&block)
  hashpool = []
  each_with_keys do |list|
    hashpool << @dataframe[@addrs[list]].execute(&block)
  end
  columns = {}
  @names.each do |name|
    columns[name] = []
  end
  each_with_keys.with_index do |list,j|
    @names.each_with_index do |name,i|
      columns[name][j] = list[i]
    end
  end
  hashpool.each_with_index do |hash, i|
    hash.each do |key, value|
      columns[key] ||= []
      columns[key][i] = value
    end
  end
  return CADataFrame.new(columns)
end