Julia DataFrame:创建列值之和的新列:x by:y
我有一个x和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
数据帧
。我想计算每个事件在数据帧中发生的频率,以及该组合所代表的: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))