keys, *data =<<_.split(/\n/).map { |line| line.split /,\s+/ }
First Name, Last Name, Age, Income, Household Size, Gender, Education
Jon, Smith, 25, 50000, 1, Male, College
Jane, Davies, 30, 60000, 3, Female, High School
Sam, Farelly, 32, 80000, 2, Unspecified, College
Joan, Favreau, 35, 65000, 4, Female, College
Sam, McNulty, 38, 63000, 3, Male, College
Mark, Minahan, 48, 78000, 5, Male, High School
Susan, Umani, 45, 75000, 2, Female, College
Bill, Perault, 24, 45000, 1, Male, Did Not Complete High School
Doug, Stamper, 45, 75000, 1, Male, College
Francis, Underwood, 52, 100000, 2, Male, College
_
Теперь у нас есть следующие значения для keys
и data
.
keys
#=> ["First Name", "Last Name", "Age", "Income", "Household Size",
# "Gender", "Education"]
data
#=> [["Jon", "Smith", "25", "50000", "1", "Male", "College"],
# ["Jane", "Davies", "30", "60000", "3", "Female", "High School"],
# ["Sam", "Farelly", "32", "80000", "2", "Unspecified", "College"],
# ["Joan", "Favreau", "35", "65000", "4", "Female", "College"],
# ["Sam", "McNulty", "38", "63000", "3", "Male", "College"],
# ["Mark", "Minahan", "48", "78000", "5", "Male", "High School"],
# ["Susan", "Umani", "45", "75000", "2", "Female", "College"],
# ["Bill", "Perault", "24", "45000", "1", "Male", "Did Not Complete High School"],
# ["Doug", "Stamper", "45", "75000", "1", "Male", "College"],
# ["Francis", "Underwood", "52", "100000", "2", "Male", "College"]]
Далее создайте следующий хэш.
h = keys.zip(data.transpose).to_h
#=> {"First Name" =>["Jon", "Jane", "Sam", "Joan", "Sam", "Mark", "Susan",
# "Bill", "Doug", "Francis"],
# "Last Name" =>["Smith", "Davies", "Farelly", "Favreau", "McNulty", "Minahan",
# "Umani", "Perault", "Stamper", "Underwood"],
# "Age" =>["25", "30", "32", "35", "38", "48", "45", "24", "45", "52"],
# "Income" =>["50000", "60000", "80000", "65000", "63000", "78000",
# "75000", "45000", "75000", "100000"],
# "Household Size"=>["1", "3", "2", "4", "3", "5", "2", "1", "1", "2"],
# "Gender" =>["Male", "Female", "Unspecified", "Female", "Male", "Male",
# "Female", "Male", "Male", "Male"],
# "Education" =>["College", "High School", "College", "College", "College",
# "High School", "College", "Did Not Complete High School",
# "College", "College"]}
Теперь просто вычислить различные статистические данные.
n = arr.size.to_f
#=> 10.0
avg_age = h["Age"].map(&:to_i).reduce(:+)/n.to_f
#=> 37.4
avg_income = h["Income"].map(&:to_i).reduce(:+)/n.to_f
#=> 69100.0
avg_hsize = h["Household Size"].map(&:to_i).reduce(:+)/n.to_f
#=> 2.4
pct_female= 100*h["Gender"].count("Female")/n.to_f
#=> 30.0
и так далее.
Computing другие статистические данные
Теперь предположим, что вы хотели, чтобы вычислить статистические данные, которые включали в себя множество клавиш, например, средний возраст женщин. Самый простой способ сделать это (а также вычислить простые средние и процентные значения) - это поместить данные в базу данных и использовать SQL-запросы. Однако мы также можем это сделать, создав массив хэшей.
arr = data.map { |row| keys.zip(row).to_h }
#=> [{"First Name"=>"Jon", "Last Name"=>"Smith", "Age"=>"25", "Income"=>"50000",
# "Household Size"=>"1", "Gender"=>"Male", "Education"=>"College"},
# {"First Name"=>"Jane", "Last Name"=>"Davies", "Age"=>"30", "Income"=>"60000",
# "Household Size"=>"3", "Gender"=>"Female", "Education"=>"High School"},
# {"First Name"=>"Sam", "Last Name"=>"Farelly", "Age"=>"32", "Income"=>"80000",
# "Household Size"=>"2", "Gender"=>"Unspecified", "Education"=>"College"},
# {"First Name"=>"Joan", "Last Name"=>"Favreau", "Age"=>"35", "Income"=>"65000",
# "Household Size"=>"4", "Gender"=>"Female", "Education"=>"College"},
# {"First Name"=>"Sam", "Last Name"=>"McNulty", "Age"=>"38", "Income"=>"63000",
# "Household Size"=>"3", "Gender"=>"Male", "Education"=>"College"},
# {"First Name"=>"Mark", "Last Name"=>"Minahan", "Age"=>"48", "Income"=>"78000",
# "Household Size"=>"5", "Gender"=>"Male", "Education"=>"High School"},
# {"First Name"=>"Susan", "Last Name"=>"Umani", "Age"=>"45", "Income"=>"75000",
# "Household Size"=>"2", "Gender"=>"Female", "Education"=>"College"},
# {"First Name"=>"Bill", "Last Name"=>"Perault", "Age"=>"24", "Income"=>"45000",
# "Household Size"=>"1", "Gender"=>"Male",
# "Education"=>"Did Not Complete High School"},
# {"First Name"=>"Doug", "Last Name"=>"Stamper", "Age"=>"45", "Income"=>"75000",
# "Household Size"=>"1", "Gender"=>"Male", "Education"=>"College"},
# {"First Name"=>"Francis", "Last Name"=>"Underwood", "Age"=>"52",
# "Income"=>"100000", "Household Size"=>"2", "Gender"=>"Male",
# "Education"=>"College"}]
Затем вычислить средний возраст женщин, создать массив возрастов для женщин, а затем подвести его элементы и разделить эту сумму на размер массива.
a = arr.each_with_object([]) { |h,a| a << h["Age"].to_i if h["Gender"]=="Female" }
#=> [30, 35, 45]
a.empty? ? 0.0 : a.reduce(:+)/a.size.to_f
#=> 36.666666666666664
Другие расчеты аналогичны.
'voter_demographics.first [: age] .instance_eval {inject (: +)/size}' –
Добро пожаловать в Stack Overflow. Хотя мы можем подчеркнуть задачу обучения, важно, чтобы вы попытались, затем повторите попытку и продолжайте, пока вы не сможете больше попробовать, когда имеете дело с домашним заданием или самостоятельным обучением. «[ask]», «[mcve]», «[Ожидается сколько усилий для исследований пользователей Stack Overflow?] (http://meta.stackoverflow.com/q/261592)». «Вопросы, требующие помощи в домашних заданиях, должны содержать резюме работы, которую вы сделали до сих пор, для решения проблемы, и описание проблемы, которую вы решаете». и http://meta.stackoverflow.com/questions/334822 –