dcast 警告:“缺少聚合函数:默认为长度”
Posted
技术标签:
【中文标题】dcast 警告:“缺少聚合函数:默认为长度”【英文标题】:dcast warning: ‘Aggregation function missing: defaulting to length’ 【发布时间】:2016-01-08 04:14:36 【问题描述】:我的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
中添加什么。有什么问题?
【问题讨论】:
根据显示的示例,我没有收到任何警告。如果您有重复,那么您可能需要创建一个序列列 如果您需要sum
(基于显示的预期输出)dcast(df, Id~Type, value.var='Freq', sum)
谢谢雅普!我不确定我是否完全理解您的解释:我的前两列(Id 和 Task)需要从两行折叠为一列。这就是我需要 fun.aggregate 函数的原因吗?如果是这样-为什么要“求和”?我不是在总结它们。
您能否指定何时收到警告消息?使用dcast(df, Id ~ Type, value.var="Freq")
还是使用dcast(df, Id + Task ~ Type, value.var="Freq")
?我只在使用dcast(df, Id ~ Type, value.var="Freq")
时收到警告(正如我在回答中所解释的那样,这是合乎逻辑的)。
我在使用 'dcast(df, Id + Task ~ Type, value.var="Freq")' 时得到它。
【参考方案1】:
您收到此警告的原因在于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
被告知要做什么:返回值的总和。
【讨论】:
很好的解释。你如何为说字符聚合这个? @NelsonGon 对于您使用的字符,例如使用toString
-函数来聚合它们:dcast(df, Id ~ Type, value.var="Freq", fun.aggregate = toString)
。或者,您可以定义自己的聚合函数 - 例如:f.agg <- function(x) paste(x, collapse = "-")
- 并使用它:dcast(df, Id ~ Type, value.var="Freq", fun.aggregate = f.agg)
但是你知道“长度”是如何工作的吗?我的意思是fun.aggregate = length
是做什么的?我想我收到这个警告是因为夏令时的重复值。
@PeyM87 它按组计算值【参考方案2】:
fun.aggregate
需要 inside value.var
列对应于 相同 值 - 或值组合 - 出现在 dcast
公式的 LHS (例如“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 的汇总(聚合)来解决:运算符、自定义或可用函数给出每种情况下的结果都是长度为一个,并且适合该目的。
【讨论】:
以上是关于dcast 警告:“缺少聚合函数:默认为长度”的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用reshape2包的dcast函数将dataframe从长表到宽表(Long- to wide-format)指定单个标识符表格转化的时候值不唯一设置聚合函数(均值)
在 reshape2 中使用 min 或 max 时没有非缺失参数警告