dcast重组从长到宽格式不工作
我的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 AB … Z 3 5 3 4 4 6
我试过了:
df_wide <- dcast(df, Id + Task ~ Type, value.var="Freq")
并得到了错误:
Aggregation function missing: defaulting to length
我不知道该怎么把fun.aggregate
。 有什么问题?
你得到这个警告的原因是在fun.aggregate
的描述中(参见?dcast
):
如果variables不能识别每个输出单元的单个观测值,则需要聚合函数。 缺省为长度(带有消息),如果需要但未指定
所以,当宽数据框中的一个点有多个值时,需要一个聚合函数。
基于您的数据的解释:
当你使用dcast(df, Id + Task ~ Type, value.var="Freq")
你会得到:
Id Task AB 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 AB 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
对于typesB
),而对于每个type
值,只能在宽数据框的这个点上放置一个值。 因此, dcast
希望将这些值汇总为一个值。 默认的聚合函数是length
,但可以使用其他聚合函数,如sum
, mean
, sd
或自定义函数,方法是使用fun.aggregate
指定它们。
例如,用fun.aggregate = sum
你会得到:
Id AB 1 3 5 3 2 4 4 6
现在没有任何警告,因为dcast
被告知如果有多个值,该怎么做:返回值的总和。