2016-10-11 4 views
-1

Если у меня есть следующие данныеМассив проблем хешей

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 

, и я хочу, чтобы создать массив хэшей, чтобы ответить на следующие вопросы Средний возраст средний доход Средний размер домохозяйства Женщины Процент Мужчина Процент Не указано Гендерный процент Процент тех, кто получил уровень образования в колледже Процент тех, кто получил уровень образования в средней школе Процент тех, кто не окончил среднюю школу

Смогу ли я организовать данные таким образом

voter_demographics = [ 
    { 
    :firstname => ["Jon", "Jane", "Sam", "Joan", "Sam", "Mark", "Susan", "Bill", "Doug", "Francis"], 
    :lastname => ["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"] 
    } 
] 

Если кто-то может просто помочь мне начать на вопрос одного (Средний возраст). Я все еще борюсь с хэшами и как вызывать данные.

For the first question ; Find Average age. Would the following work. 
sum = 0 
voter_demographics.each do |:age| 
sum = sum + :age 
average = sum/:age.length 
puts "The average is #{average}". 

Im застрял на этом. И если есть какие-то ресурсы для новичков, вы можете порекомендовать хеши и массив хэшей, которые были бы замечательными!

+1

'voter_demographics.first [: age] .instance_eval {inject (: +)/size}' –

+0

Добро пожаловать в Stack Overflow. Хотя мы можем подчеркнуть задачу обучения, важно, чтобы вы попытались, затем повторите попытку и продолжайте, пока вы не сможете больше попробовать, когда имеете дело с домашним заданием или самостоятельным обучением. «[ask]», «[mcve]», «[Ожидается сколько усилий для исследований пользователей Stack Overflow?] (http://meta.stackoverflow.com/q/261592)». «Вопросы, требующие помощи в домашних заданиях, должны содержать резюме работы, которую вы сделали до сих пор, для решения проблемы, и описание проблемы, которую вы решаете». и http://meta.stackoverflow.com/questions/334822 –

ответ

0

Я задаюсь вопросом, почему у вас есть voter_demographics как массив. Если убрать квадратные скобки, то это будет просто хэш, как это:

voter_demographics = { 
    :firstname => ["Jon", "Jane", "Sam", "Joan", "Sam", "Mark", "Susan", "Bill", "Doug", "Francis"], 
    :lastname => ["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"] 
} 

Затем вы можете получить доступ к значениям в хэш, как это:

voter_demographics[:age] 

И найти свой средний будет работать, как это :

voter_demographics[:age].inject(:+).to_f/voter_demographics[:age].size 

или

ages = voter_demographics[:age] 
ages.inject(:+).to_f/ages.size 

.to_f предполагает, что вы хотите вернуть номер плавания, поэтому мои решения предоставят вам 37.4 вместо

Другим решением было бы просто использовать обычные переменные вместо хеша:

firstnames = ["Jon", "Jane", "Sam", "Joan", "Sam", "Mark", "Susan", "Bill", "Doug", "Francis"], 
lastnames = ["Smith", "Davies", "Farelly", "Favreau", "McNulty", "Minahan", "Umani", "Perault", "Stamper", "Underwood"], 
ages = [25, 30, 32, 35, 38, 48, 45, 24, 45, 52], 
incomes = [50000, 60000, 80000, 65000, 63000, 78000, 75000, 45000, 75000, 100000], 
household_sizes = [1, 3, 2, 4, 3, 5, 2, 1, 1, 2], 
genders = ["male", "female", "unspecified", "female", "male", "male", "female", "male", "male", "male"], 
educations = ["college", "high school", "college", "college", "college", "high school", "college", "did not complete high school", "college", "college"] 

Тогда это будет работать:

ages.inject(:+).to_f/ages.size 
0

ваш voter_demographics массив только с одним элементом

voter_demographics[0] 
=> {:firstname=>["Jon", "Jane", "Sam", "Joan", "Sam", "Mark", "Susan", "Bill", "Doug", "Francis"], :lastname=>["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"]} 
voter_demographics[1] 
=> nil 

Итак, давайте возьмем первый элемент и получить возрастную данные:

age_data = voter_demographics[0][:age] 
=> [25, 30, 32, 35, 38, 48, 45, 24, 45, 52] 

Теперь мы можем суммировать данные

sum = 0 
age_data.each { |e| sum = sum + e } 
sum 
=> 374 

или только

age_data.inject(:+) 
=> 374 

Вы также можете получить количество элементов

age_data.size 
=> 10 

Наконец

age_data.inject(:+)/age_data.size 
=> 37 

Я надеюсь, что это поможет вам понять это;)

1
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 

Другие расчеты аналогичны.

0

Чтобы ответить на первую часть вашего вопроса, как организовать свои данные в voter_demographics, вы можете использовать парсер csv в рубине. Итак, сохраните данные в формате file.csv и проанализируйте его.

require 'csv' 

csv_data = CSV.parse(File.read('file1.csv'), headers: true, header_converters: :symbol) 

data_array = csv_data.map {|arr| arr.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"}, 
...] 

Теперь мы можем написать что-то, чтобы форматировать эти данные в нужный формат.

result = {} 

data_array[0].each do |k, v| 
    result[k] = data_array.map {|hash| hash[k].strip } 
end 

Другие ответы уже ответили на вторую часть вашего вопроса, поэтому я больше не буду здесь этого делать.

Смежные вопросы