2017-05-16 13 views
4

xとyのオカレンスのDataFrameがあります。 DataFrameでそれぞれの発生がどのくらいの頻度で発生したのか、組み合わせが表すものは何%の割合であるのかを数えたいと思います。 a previous questionのおかげで、私は今、最初の部分を持っています。Julia DataFrame:col値の新しい列の合計を作成します。x by:y

using DataFrames 
mydf = DataFrame(y = rand('a':'h', 1000), x = rand('i':'p', 1000)) 
mydfsum = by(mydf, [:x, :y], df -> DataFrame(n = length(df[:x]))) 

これが成功し:xの各値は:yの各値に発生頻度をカウント列を作成します。今度は、:yの各値の頻度をカウントする新しい列を生成する必要があります。私は次の使用して新しいDataFrameを作成することができます。

mydfsumy = by(mydf, [:y], df -> DataFrame(ny = length(df[:x]))) 

DataFrames一緒に参加しましょう。

mydfsum = join(mydfsum, mydfsumy, on = :y) 

とパーセンテージ:yp

mydfsum[:yp] = mydfsum[:n] ./ mydfsum[:ny] 

を作成しかし、これは一般的なデータ管理の問題のための不格好な回避策のように思えます。 RIでdplyrを使用して1行でこのすべてを行うだろう:

mydf %>% groupby(x,y) %>% summarize(n = n()) %>% groupby(y) %>% mutate(yp = n/sum(n)) 

答えて

2

あなたは1行でそれを行うことができます。

mydfsum = by(mydf, :y, df -> by(df, :x, dd -> DataFrame(n = size(dd,1), yp = size(dd,1)/size(df,1))))

か、それが読みにくくなる場合は、使用することができます匿名関数のためのdo表記:

mydfsum = by(mydf,:y) do df by(df, :x) do dd DataFrame(n = size(dd,1), yp = size(dd,1)/size(df,1)) end end

何をRでやっていることです最初にxyの両方に最初にbyを実行し、出力の列を変更します。それを行うこともできますが、最初にその列を作成する必要があります。ここでは、最初にyp列をゼロで初期化し、別のbyでその位置を変更します。より高度なデータ操作のために

mydfsum = by(mydf,[:x,:y], df -> DataFrame(n = size(df,1), yp = 0.)) by(mydfsum, :y, df -> (df[:yp] = df[:n]/sum(df[:n])))

あなたはQuery.jl

を見てみたいことがあり
関連する問題