如何为温度数据集创建平均值?

时间:2013-09-24 20:48:21

标签: ruby-on-rails ruby arrays ruby-on-rails-3 split

我正在编写一个程序,它接受一组数据然后对其进行平均。该数据集是拉瓜迪亚机场每个月的平均温度,与温度相对应。

以下是一个数据点示例:

    2009-07,23.6

哪个是年月,临时。

我有163个数据点。所有数据点都在.txt文件中,每个文件都在一个新行上。

我将数据制作成数组并将其拆分。出于某种原因,我的程序说每次尝试运行它时我的平均值为0

这是我的代码:

data = File.open("avg_temp.txt", "r+")

contents = data.read

contents = contents.split("\r\n")

contents.collect! do |x|
        x.split(',')
end


sum = 0

data.each do |x|

sum = sum  + x[1].to_f

end

avg = sum / contents.length

puts avg

4 个答案:

答案 0 :(得分:2)

在结束后将avg = sum/contents.length分配到循环之外。循环中定义的变量的范围仅限于该循环。您也在循环data,应该是content

contents.each do |x|

    puts x[1] # to check if the right value is being evaluated
    sum = sum  + x[1].to_f     

end

avg = sum/contents.length

答案 1 :(得分:2)

您的avg不是顶级本地变量。因此,您无法从顶层访问它。 avg仅限于块。你可以在下面做: -

avg = 0

data.each do |x|
  sum = sum  + temp[1].to_f
  avg = sum / contents.length
end

puts avg

答案 2 :(得分:1)

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
end
puts avg

avg变量不再在范围内,因为它在每个块之外。要打印平均值,只需将其移动到块内即可

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
    avg = sum / contents.length
    puts avg
end

或者将avg变量移到循环之外(在循环退出后执行一次动作)

sum = 0
data.each do |x|
    sum = sum  + temp[1].to_f
end

avg = sum / contents.length
puts avg

http://rubyflare.com/2009/09/30/variables-scope-and-iterators/

的更多信息

答案 3 :(得分:0)

我更简单地写这个:

lines = 0
sum = 0

File.foreach("avg_temp.txt") do |data|
  sum += data.split(',').last.to_f
  lines = $.
end

puts 'Average: %f over %d datapoints' % [sum / lines.to_i, lines]
# >> Average: 23.375000 over 4 datapoints

哪个输出:

Average: 23.375000 over 4 datapoints

以" avg_temp.txt"开头看起来像:

2009-07,23.6
2009-08,23.7
2009-09,23.6
2009-10,22.6

要咒骂它:

  • $.是当前的行号。每次通过循环时,它会将最后读取的行号重新分配给lines,以便我们知道要划分的数量。
  • foreach逐行阅读,因此无需拆分文件。这也解释了为什么我使用$.来跟踪元素的数量。这也意味着这可以读取包含数百万或数十亿价值而没有问题的文件,read会跪在地上。