2017-11-21 10 views
1

特に、私はR::data.tabled[, function(...), by = key]のようなものが欲しいです。別のStackOverflowの質問( Julia Dataframe group by and pivot tables functions)のための答えを使用して、私は、このソリューションを持っている:ジュリアでのファストグループの運営方法

using DataFrames 

df =DataFrame(Location = [ "NY", "SF", "NY", "NY", "SF", "SF", "TX", "TX", "TX", "DC"], 
       Class = ["H","L","H","L","L","H", "H","L","L","M"], 
       Address = ["12 Silver","10 Fak","12 Silver","1 North","10 Fak","2 Fake", "1 Red","1 Dog","2 Fake","1 White"], 
       Score = ["4","5","3","2","1","5","4","3","2","1"]) 


julia> by(df, :Location, d -> DataFrame(count=nrow(d))) 
4x2 DataFrames.DataFrame 
| Row | Location | count | 
|-----|----------|-------| 
| 1 | "DC"  | 1  | 
| 2 | "NY"  | 3  | 
| 3 | "SF"  | 3  | 
| 4 | "TX"  | 3  | 

正常に動作しますが、それは大規模なデータセットのために非常に遅いことが判明したこと。速い解決策はありますか?

+0

チェックも、この(やや厄介)スレッド及び関連するブログ記事のhttps:(逐次的に計算することができます)他の集約関数のために我々は関数を定義することができます/ /discourse.julialang.org/t/various-by-group-strategies-compared/6594 –

答えて

1

をカウントするため、以下のソリューションは高速ですが読み取り可能ではありません:与える

countdf(df::DataFrame, fld) = 
    (h = countmap(df[fld]) ; DataFrame(collect.([keys(h),values(h)]),[fld,:count])) 

cmap = countmap(df[:Location]); 
res = DataFrame(Location=collect(keys(cmap)),count=collect(values(cmap))) 
(をカウント ため再び)、または、より一般的に

julia> countdf(df,:Location) 
4×2 DataFrames.DataFrame 
│ Row │ Location │ count │ 
├─────┼──────────┼───────┤ 
│ 1 │ "DC"  │ 1  │ 
│ 2 │ "SF"  │ 3  │ 
│ 3 │ "NY"  │ 3  │ 
│ 4 │ "TX"  │ 3  │ 

foldmap(op, v0, df, col) = 
    foldl((x,y)->setindex!(x,op(get(x,y[col],v0),y),y[col]), 
    Dict{eltype(df[col]),typeof(v0)}(), eachrow(df)) 
folddf(op, v0, df, col) = 
    (h = foldmap(op, v0, df, col) ; 
    DataFrame(collect.([keys(h),values(h)]),[col,:res])) 

inc1(x,y) = x+1 
sumScore(x,y) = x+y[:Score] 
maxScore(x,y) = max(x,y[:Score]) 
これらの定義では

julia> eltype(df[:Score])<:Real || (df[:Score] = parse.(Float64, df[:Score])); 

julia> foldmap(inc1, 0, df, :Location) 
Dict{String,Int64} with 4 entries: 
    "DC" => 1 
    "SF" => 3 
    "NY" => 3 
    "TX" => 3 

julia> folddf(sumScore, 0.0, df, :Location) 
4×2 DataFrames.DataFrame 
│ Row │ Location │ res │ 
├─────┼──────────┼──────┤ 
│ 1 │ "DC"  │ 1.0 │ 
│ 2 │ "SF"  │ 11.0 │ 
│ 3 │ "NY"  │ 9.0 │ 
│ 4 │ "TX"  │ 9.0 │ 

julia> folddf(maxScore, 0.0, df, :Location) 
4×2 DataFrames.DataFrame 
│ Row │ Location │ res │ 
├─────┼──────────┼─────┤ 
│ 1 │ "DC"  │ 1.0 │ 
│ 2 │ "SF"  │ 5.0 │ 
│ 3 │ "NY"  │ 4.0 │ 
│ 4 │ "TX"  │ 4.0 │ 
関連する問題