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