我的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
放什么。有什么问题?
您收到此警告的原因在于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
这是合乎逻辑的,因为对于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
现在,回顾一下数据的顶部:
Id Task Type Freq
3 1 A 2
3 1 B 3
3 2 A 3
3 2 B 0
你明白为什么会这样。对于Id
和Type
的每个组合,在Freq
中有两个值(对于Id 3:2
和3
用于A
和3
,0
用于B
类型),而在type
的每个值的宽数据帧中,您只能在此点中放置一个值。因此,dcast
想要将这些值聚合成一个值。默认聚合函数是length
,但您可以使用其他聚合函数,如sum
,mean
,sd
或自定义函数,通过使用fun.aggregate
指定它们。
例如,使用fun.aggregate = sum
,您将获得:
Id A B
1 3 5 3
2 4 4 6
现在没有警告,因为当有多个值时,dcast
被告知要做什么:返回值的总和。