Julia DataFrame:创建col值的新列总和:x by:y

我有一个x和y出现的DataFrame.我想计算每次事件在DataFrame中发生的频率以及该组合所代表的y次出现的百分比.由于 a previous question,我现在已经完成了第一部分.

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])))

一起加入DataFrame.

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

并创建百分比:yp列

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

但对于常见的数据管理问题,这似乎是一个笨重的解决方法.在R中,我将使用dplyr在一行中完成所有这些:

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

最佳答案 你可以在一行中完成:

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

或者,如果难以阅读,您可以使用匿名函数的符号:

mydfsum = by(mydf,:y)do df
    通过(df,:x)做dd
        DataFrame(n = size(dd,1),yp = size(dd,1)/ size(df,1))
    结束
结束

你在R中做的事实上是先做x和y,然后改变输出的一列.您也可以这样做,但您需要先创建该列.在这里,我首先用零初始化yp列,然后用另一个修改它.

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

点赞