Там SplitApplyCombine.jl
, который реализует (что неудивительно) логику разделения-применения-объединения c, подобную той, что есть в DataFrames. Это пример, в котором я бы держался подальше от простых однострочных / коротких решений и писал бы вещи более подробно, чтобы сделать код читаемым и понятным, если кто-то другой (или вы сами через несколько месяцев!) Прочитает его:
julia> tups = [(1, 223.2, 2, 2)
(1, 253.2, 3, 2)
(2, 220.0, 4, 6)
(3, 110.0, 1, 4)
(3, 100.0, 3, 8)]
5-element Array{Tuple{Int64,Float64,Int64,Int64},1}:
(1, 223.2, 2, 2)
(1, 253.2, 3, 2)
(2, 220.0, 4, 6)
(3, 110.0, 1, 4)
(3, 100.0, 3, 8)
julia> using SplitApplyCombine
julia> function my_fun(x) # function to apply
if length(x) == 1
return (x[1][1], typemax(Float64) - x[1][2], x[1][3], x[1][4])
else
return (x[1][1], -diff(sort(getindex.(x, 2), rev = true)[1:2]), x[1][4])
end
end
my_fun (generic function with 1 method)
julia> [my_fun(x) for x in group(first, tups)] # apply function group wise
3-element Array{Tuple{Int64,Any,Int64,Vararg{Int64,N} where N},1}:
(2, Inf, 4, 6)
(3, [10.0], 4)
(1, [30.0], 2)
Если производительность вызывает беспокойство, вы можете подумать о my_fun
и провести некоторое профилирование, чтобы увидеть, можно ли и как его улучшить - единственное, что я здесь сделал, это использовал diff
чтобы вычесть первый из второго элемента отсортированного массива, чтобы избежать двойной сортировки.