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

Julia DataFrame:创建列值之和的新列:x by:y,dataframe,julia,Dataframe,Julia,我有一个x和y引用的数据帧。我想计算每个事件在数据帧中发生的频率,以及该组合所代表的:y事件的百分比。多亏了你,我现在把第一部分记下来了 这将成功创建一列,计算:x的每个值与:y的每个值一起出现的频率。现在,我需要能够生成一个新的列来计算:y的每个值出现的频率。接下来,我可以使用以下方法创建一个新的DataFrame: mydfsumy = by(mydf, [:y], df -> DataFrame(ny = length(df[:x]))) 将数据帧连接在一起 mydfsum = j

我有一个x和y引用的
数据帧
。我想计算每个事件在
数据帧中发生的频率,以及该组合所代表的
:y
事件的百分比。多亏了你,我现在把第一部分记下来了

这将成功创建一列,计算
:x的每个值与
:y的每个值一起出现的频率。现在,我需要能够生成一个新的列来计算
:y的每个值出现的频率。接下来,我可以使用以下方法创建一个新的
DataFrame

mydfsumy = by(mydf, [:y], df -> DataFrame(ny = length(df[:x])))
数据帧
连接在一起

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

或者,如果这变得难以阅读,您可以对匿名函数使用
do
符号:

mydfsum=by(mydf,:y)do-df
by(df,:x)do dd
数据帧(n=大小(dd,1),yp=大小(dd,1)/大小(df,1))
结束
结束

在R中所做的实际上是在
x
y
上首先执行
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]))

对于更高级的数据操作,您可能需要查看

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