lib/data_frame.rb in davidrichards-data_frame-0.0.13 vs lib/data_frame.rb in davidrichards-data_frame-0.0.14

- old
+ new

@@ -210,10 +210,15 @@ end @items = items.dup self end + def filter(as=Array, &block) + new_data_frame = self.clone + new_data_frame.filter!(as, &block) + end + def infer_class(obj) obj = obj.to_s.classify.constantize if obj.is_a?(Symbol) obj = obj.classify.constantize if obj.is_a?(String) obj end @@ -233,11 +238,11 @@ end obj elsif as == Array row else - as.new(row) + as.new(*row) end end protected :cast_row # Creates a new data frame, only with the specified columns. @@ -250,8 +255,56 @@ new_data_frame.import(self.items) self.labels.each do |label| new_data_frame.drop!(label) unless new_labels.include?(label) end new_data_frame + end + + # A weird name. This creates a column for every category in a column + # and marks each row by its value + def j_binary_ize!(*columns) + columns.each do |col| + values = render_column(col.to_underscore_sym) + values.categories.each do |category| + self.append!(category, values.map{|e| e == category ? true : false}) + end + end + end + + # Adds a unique column to the table + def append!(column_name, value=nil) + raise ArgumentError, "Can't have duplicate column names" if self.labels.include?(column_name) + self.labels << column_name.to_underscore_sym + if value.is_a?(Array) + self.items.each_with_index do |item, i| + item << value[i] + end + else + self.items.each do |item| + item << value + end + end + # Because we are tainting the sub arrays, the TaintableArray doesn't know it's been changed. + self.items.taint + end + + def filter_by_category(hash) + new_data_frame = self.dup + hash.each do |key, value| + key = key.to_underscore_sym + next unless self.labels.include?(key) + value = [value] unless value.is_a?(Array) or value.is_a?(Range) + new_data_frame.filter!(:hash) {|row| value.include?(row[key])} + end + new_data_frame + end + + def filter_by_category!(hash) + hash.each do |key, value| + key = key.to_underscore_sym + next unless self.labels.include?(key) + value = [value] unless value.is_a?(Array) or value.is_a?(Range) + self.filter!(:hash) {|row| value.include?(row[key])} + end end end \ No newline at end of file