Sorting 按数组中的不同值分组求和

Sorting 按数组中的不同值分组求和,sorting,multidimensional-array,julia,Sorting,Multidimensional Array,Julia,我是朱莉娅(和所有编程tbh)的新手。我有一个数组,看起来像 5048574×2数组{Float64,2}: 22 1990 3 1990年 4 1991 3 1992 1992年4月 我需要对第1列中与第2列中年份对应的值求和。例如,输出应该是 25 1990 4 1991 7 1992有很多方法可以做到这一点,但作为初学者,您可能会发现更多地使用更高级的工具是很有帮助的。如果您使用,那么您可以使用它的更高级别的方法 我将使用列名count和year以及随机值创建一个假数据集。如果您是从CSV

我是朱莉娅(和所有编程tbh)的新手。我有一个数组,看起来像

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

我需要对第1列中与第2列中年份对应的值求和。例如,输出应该是

25 1990
4 1991

7 1992

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

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

现在,您可以使用
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\u sum
列。即使在我的旧笔记本电脑上,这也不到一秒钟就完成了。当然有更快的方法可以做到这一点,但我认为这里的易用性是值得的。

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

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

现在,您可以使用
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\u sum
列。即使在我的旧笔记本电脑上,这也不到一秒钟就完成了。当然有更快的方法可以做到这一点,但我认为这里的易用性是值得的。

如果您想在没有数据帧的情况下做到这一点,一个简单的方法是使用
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

如果要在没有数据帧的情况下执行此操作,一种简单的方法是使用
Dict
iatory:

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

欢迎如此这般&朱莉娅!你可以用很多方法来做这件事。我建议看一下julia文档或julia教程(都链接在julia lang网站上),并思考一下您可能希望如何通过编程解决这个问题。如果你被卡住了,你可以在这里问一个问题(并发布一些示例代码!)。我强烈建议在涉足并行计算之前,先熟悉一些基本知识。看起来这里有很多问题需要解决。事实上,我不确定我是否理解这个问题。您可能希望在友好的聊天室中获得帮助,以帮助进一步完善问题。为此,您可以访问,我们可以帮助您重新开始。感谢您的快速回复。我会照建议去做欢迎某某&朱莉娅!你可以用很多方法来做这件事。我建议看一下julia文档或julia教程(都链接在julia lang网站上),并思考一下您可能希望如何通过编程解决这个问题。如果你被卡住了,你可以在这里问一个问题(并发布一些示例代码!)。我强烈建议在涉足并行计算之前,先熟悉一些基本知识。看起来这里有很多问题需要解决。事实上,我不确定我是否理解这个问题。您可能希望在友好的聊天室中获得帮助,以帮助进一步完善问题。为此,您可以访问,我们可以帮助您重新开始。感谢您的快速回复。我会按照建议去做如何更快地去做?我认为可以公平地说,大多数Julia用户都是R/Python/Matlab的主要用户,只有当他们需要速度时才会使用Julia。如何更快地使用它?我认为可以公平地说,大多数Julia用户都是R/Python/Matlab的主要用户,只有在需要速度的时候才会访问Julia。