由数组中的不同值分组的总和

时间:2017-01-18 16:52:09

标签: sorting multidimensional-array julia

我是朱莉娅的新手(以及所有编程tbh)。我有一个看起来像

的数组

5048574×2数组{Float64,2}:
1990年 1990年3月 1991年11月 1992年3月 1992年4月

我需要将第1列中与第2列中的年份相对应的值相加。例如,输出应该类似于

25 1990年 1991年11月 1992年7月

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点,但作为初学者,您可能会发现更多地依赖更高级别的工具会很有帮助。如果您使用DataFrames package,那么您可以使用它的更高级split-apply-combine方法。

我将使用列名countyear以及随机值创建虚假数据集。如果您要从CSV加载数据,请注意您可以直接从中创建数据框。否则,您可以使用DataFrame(count=view(A, :, 1), year=view(A, :, 2))从现有矩阵创建数据框。

julia> using DataFrames

julia> df = DataFrame(count=rand(1:30, 5048574), year=rand(1900:2017, 5048574))
5048574×2 DataFrames.DataFrame
│ Row     │ count │ year │
├─────────┼───────┼──────┤
│ 1       │ 19    │ 1948 │
│ 2       │ 8     │ 1994 │
│ 3       │ 20    │ 1940 │
│ 4       │ 21    │ 2000 │
│ 5       │ 28    │ 1982 │
│ 6       │ 18    │ 1904 │
⋮

现在,您可以使用groupby运算符按年将数据集拆分为多个组,然后将其传递给sum函数:

julia> groupby(df, :year) |> sum
118×2 DataFrames.DataFrame
│ Row │ year │ count_sum │
├─────┼──────┼───────────┤
│ 1   │ 1900 │ 667412    │
│ 2   │ 1901 │ 663045    │
│ 3   │ 1902 │ 669364    │
│ 4   │ 1903 │ 665388    │
│ 5   │ 1904 │ 664468    │
│ 6   │ 1905 │ 664388    │
│ 7   │ 1906 │ 666246    │
⋮

您可以看到它智能地命名了您的count_sum列。即使在我的旧笔记本电脑上,也只需不到一秒钟即可完成。肯定有更快的方法,但我认为这里的易用性非常值得。

答案 1 :(得分:2)

如果你想在没有DataFrames的情况下这样做,一个简单的方法是使用Dict离子:

julia> s = Dict{Int,Int}()
Dict{Int64,Int64} with 0 entries

julia> for i = 1:size(A,1)
           v, y = A[i,1], A[i,2]
           if haskey(s, y)
               s[y] += v
           else
               s[y] = v
           end
       end

julia> s
Dict{Int64,Int64} with 3 entries:
  1990 => 25
  1992 => 7
  1991 => 4