dcast错误:'遗漏聚合函数:默认为长度'

use*_*563 12 r reshape reshape2 data.table

df看起来像这样:

Id  Task Type    Freq  
3     1    A       2
3     1    B       3
3     2    A       3
3     2    B       0
4     1    A       3
4     1    B       3
4     2    A       1
4     2    B       3
Run Code Online (Sandbox Code Playgroud)

我想通过Id进行重组并得到:

Id   A    B …  Z    
3    5    3      
4    4    6        
Run Code Online (Sandbox Code Playgroud)

我试过了:

df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq")
Run Code Online (Sandbox Code Playgroud)

并得到错误:

聚合函数缺失:默认为长度

我无法弄清楚要放什么fun.aggregate.有什么问题?

Jaa*_*aap 18

您收到此警告的原因在fun.aggregate(参见?dcast)的说明中:

如果变量没有为每个输出单元识别单个观察,则需要聚合函数.如果需要,默认为长度(带消息)但未指定

因此,当宽数据帧中的一个点有多个值时,需要聚合函数.

基于您的数据的解释:

当你使用 dcast(df, Id + Task ~ Type, value.var="Freq")你得到:

  Id Task A B
1  3    1 2 3
2  3    2 3 0
3  4    1 3 3
4  4    2 1 3
Run Code Online (Sandbox Code Playgroud)

这是合乎逻辑的,因为对于每个组合Id,Task并且Type只有价值Freq.但是当你使用的时候dcast(df, Id ~ Type, value.var="Freq")会得到这个(包括警告信息):

Aggregation function missing: defaulting to length
  Id A B
1  3 2 2
2  4 2 2
Run Code Online (Sandbox Code Playgroud)

现在,回顾一下数据的顶部:

Id  Task Type    Freq  
3     1    A       2
3     1    B       3
3     2    A       3
3     2    B       0
Run Code Online (Sandbox Code Playgroud)

你明白为什么会这样.对于每个组合,Id并且Type有两个值Freq(对于Id 3:23对于A&30对于Type B),而对于每个值,您只能在宽数据帧中的这个点中放置一个值type.因此,dcast希望将这些值聚合为一个值.默认聚合函数length,但是你可以使用像其他聚合函数sum,mean,sd通过指定他们或自定义的功能fun.aggregate.

例如,随着fun.aggregate = sum你得到:

  Id A B
1  3 5 3
2  4 4 6
Run Code Online (Sandbox Code Playgroud)

现在没有警告,因为dcast当有多个值时被告知要做什么:返回值的总和.

  • @NelsonGon例如,对于字符,您可以使用toString函数来汇总它们:dcast(df,Id〜Type,value.var =“ Freq”,fun.aggregate = toString)。或者,您可以定义自己的聚合函数-例如:f.agg &lt;-function(x)paste(x,塌陷=“-”)`-并使用该函数:dcast(df,Id〜Type,value.var = “ Freq”,fun.aggregate = f.agg)` (2认同)