2017-11-23 10 views
0

추가 조작을 위해 DataFrame으로 바꾸기 전에 축소 작업을 수행해야하므로 JSON 파일에서 배열을 읽는 중입니다. 인수의 위해를 들어,이 그것을Julia에서 사전 배열을 "그룹화"할 수 있습니까?

이제
a = [Dict("A" => 1, "B" => 1, "C" => "a") 
    Dict("A" => 1, "B" => 2, "C" => "b") 
    Dict("A" => 2, "B" => 1, "C" => "b") 
    Dict("A" => 2, "B" => 2, "C" => "a")] 

의 I 그룹 하나 이상의 키 (예를 들어, A와 C)에 의해 배열 내가 할 수있는 경우 크게 간소화 될 수행하고있어 감소라고하자, 수행 각 그룹에서 더 간단하게 감소시키고 나중에 행을 Dict의 더 큰 배열로 재결합하여 나는 쉽게 DataFrame으로 바뀔 수 있습니다.

하나의 해결책은 이것을 DataFrame으로 바꾸고, 그룹으로 나누고, 개별 그룹을 행렬로 바꾸고, 줄이기 (몇 가지 어려움이 있습니다. 왜냐하면 이제는 이름으로 요소를 참조 할 수있는 능력을 잃어 버렸기 때문입니다) 감소 된 행렬을 다시 (Sub?)DataFrame으로 바꿉니다 (이름이 있기 때문에 좀 더 어려움이 있습니다). 모두 하나의 거인 DataFrame에 잘 맞기를 바랍니다.

더 쉽고 실용적인 방법은 무엇입니까? 누군가가 내가 Query.jl 보면 알 수

편집 전에, 나는 다음 행의 특정 쌍을 부수있어 때문에 나는 적은 수의 행으로 반환 배열을 실행 해요 줄일 수 있습니다. 만약 내가 Query.jl과 같은 일을 할 수 있다면, 누군가가 어떻게 힌트를 줄 수 있겠습니까? 문서가 단일 값을 반환하지 않는 것으로 "집계"하는 방법에 대해 정확히 명확하지 않기 때문입니다. 예 :

는 "C"에 의해 그룹과

A B C 
----------- 
1 1 a 
3 2 b 

가 명확히처럼 뭔가에 해당 테이블을 설정, 작업 줄이기, 나는 단지 여부를 확인하지 않아도하여 단순화하고자한다

A B C 
----------- 
1  a 
2 1 a 
3  b 
4 2 b 
행은 이전 행의 동일한 그룹에 속하며 스쿼시를 수행합니다.

답변

0

아직 실험 중이지만 SplitApplyCombine.jl은 그럴 수 있습니다. 원하는 임의의 키 기능을 사용하여 임의의 iterables를 그룹화하고 끝에 key -> group dict을 가져올 수 있습니다.

julia> @_ a |> group(x->x["C"], _) |> values(_) |> reduce(vcat, _) 
4-element Array{Dict{String,Any},1}: 
Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 1),Pair{String,Any}("C", "b")) 
Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 2),Pair{String,Any}("C", "b")) 
Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 1),Pair{String,Any}("C", "a")) 
Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 2),Pair{String,Any}("C", "a")) 
:
julia> ## Pkg.clone("https://github.com/JuliaData/SplitApplyCombine.jl.git") 

julia> using SplitApplyCombine 

julia> group(x->x["C"], a) 
Dict{Any,Array{Dict{String,Any},1}} with 2 entries: 
    "b" => Dict{String,Any}[Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 1),Pair{String,Any}("C", "b")), Dict{String,Any}(Pair{String,Any}("… 
    "a" => Dict{String,Any}[Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 1),Pair{String,Any}("C", "a")), Dict{String,Any}(Pair{String,Any}("… 

은 그럼 당신은 (배관 용 SAC @_ 매크로를 사용하여 여기에) 표준 [map]reduce 작업을 사용할 수 있습니다