我的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
里放什么。有什么问题吗?
发布于 2015-10-10 15:35:10
您收到此警告的原因在于对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
被告知当有多个值时该怎么做:返回值的总和。
发布于 2021-06-02 04:22:40
当value.var
列中的不同值对应于相同的值或值的组合出现在dcast
公式的LHS上时,需要使用fun.aggregate
。"Id"),通过公式的RHS中的变量组合(例如,"Type")。
在dcast
中默认为length()
是信息性的,因为它
length > 1
案例。更具信息性的是使用函数list()
作为fun.aggregate
,因为它显示了每种情况下涉及的value.var
值:
dcast(dt, Id ~ Type, fun.aggregate = list, value.var = 'Freq')
Id A B
1: 3 2,3 3,0
2: 4 3,1 3,3
基本上,表格单元格的长度为1。因此,dcast
中的默认情况可以通过修改公式或实现长度为1的汇总(聚合)来解决:运算符、自定义或可用函数,这些运算符、自定义或可用函数在每种情况下都会产生一个长度,并且适合于此目的。
https://stackoverflow.com/questions/33051386
复制相似问题