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

问题描述 投票:8回答:1

我的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

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

Id   A    B …  Z    
3    5    3      
4    4    6        

我试过了:

df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq")

并得到错误:

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

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

r data.table reshape reshape2
1个回答
14
投票

您收到此警告的原因在于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

这是合乎逻辑的,因为对于IdTaskType的每个组合,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

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

Id  Task Type    Freq  
3     1    A       2
3     1    B       3
3     2    A       3
3     2    B       0

你明白为什么会这样。对于IdType的每个组合,在Freq中有两个值(对于Id 3:23用于A30用于B类型),而在type的每个值的宽数据帧中,您只能在此点中放置一个值。因此,dcast想要将这些值聚合成一个值。默认聚合函数是length,但您可以使用其他聚合函数,如summeansd或自定义函数,通过使用fun.aggregate指定它们。

例如,使用fun.aggregate = sum,您将获得:

  Id A B
1  3 5 3
2  4 4 6

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

© www.soinside.com 2019 - 2024. All rights reserved.