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

这是合乎逻辑的,因为对于 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 对于 A & 30 对于类型 B)而对于type 的每个值,您只能在宽数据框中的该位置放置一个值。因此dcast 想要将这些值聚合为一个值。默认聚合函数为length,但您可以使用其他聚合函数,例如summeansd,或通过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 &lt;- 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 &gt; 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 时没有非缺失参数警告

dcast 中的 value.var 可以是一个列表还是有多个值变量?

Spark是不是支持melt和dcast [重复]

dcast 有效地使用多个变量的大型数据集

在 Hadoop 或 MySQL 中重塑 dcast 表