我是朱莉娅的新手(以及所有编程tbh)。我有一个看起来像
的数组 5048574×2数组{Float64,2}:
1990年
1990年3月
1991年11月
1992年3月
1992年4月
我需要将第1列中与第2列中的年份相对应的值相加。例如,输出应该类似于
25 1990年 1991年11月 1992年7月
答案 0 :(得分:3)
有很多方法可以做到这一点,但作为初学者,您可能会发现更多地依赖更高级别的工具会很有帮助。如果您使用DataFrames
package,那么您可以使用它的更高级split-apply-combine方法。
我将使用列名count
和year
以及随机值创建虚假数据集。如果您要从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