在 reshape2 中使用 min 或 max 时没有非缺失参数警告

Posted

技术标签:

【中文标题】在 reshape2 中使用 min 或 max 时没有非缺失参数警告【英文标题】:No non-missing arguments warning when using min or max in reshape2 【发布时间】:2014-08-08 13:43:33 【问题描述】:

当我在 reshape2 包的 dcast 函数中使用 min 或 max 时,我收到以下警告。它在告诉我什么?我找不到任何解释警告消息的内容,而且我有点困惑为什么我在使用 max 时得到它,但在我使用 mean 或其他聚合函数时却没有。

警告消息:在 .fun(.value[0], ...) 中:min 没有非缺失参数;返回Inf

这是一个可重现的例子:

data(iris)

library(reshape2)

molten.iris <- melt(iris,id.var="Species")
summary(molten.iris)
str(molten.iris)
#------------------------------------------------------------
# Both return warning:
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=min)
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=max)

# Length looks fine though
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=length)

#------------------------------------------------------------
# No warning messages here:
aggregate(value ~ Species + variable, FUN=min, data=molten.iris)
aggregate(value ~ Species + variable, FUN=max, data=molten.iris)
#------------------------------------------------------------
# Or here:
library(plyr)

ddply(molten.iris,c("Species","variable"),function(df)
  data.frame(
    "min"=min(df$value),
    "max"=max(df$value)
    )
)
#------------------------------------------------------------

【问题讨论】:

使用minmax 而不是mean 时出现这种情况的原因是mean 在应用于长度为0 的向量时不会引发警告。如果您执行dcast(data=molten.iris,Species~variable,value.var="value", function(x) print(x); min(x)),您会看到第一个x 是长度为0 的数字向量。由于默认情况下dcast 中的fill=NULL,然后min 被应用于长度为0 的向量并产生警告。问题是为什么存在这种结构模式,即返回的第一个元素的长度为 0 向量......不知道为什么会发生这种情况,因为所有因素组合似乎都存在 【参考方案1】:

您收到此警告是因为最小值/最大值应用于长度为 0 的数字参数。

这会重现警告。

min(numeric(0))
[1] Inf
Warning message:
In min(numeric(0)) : no non-missing arguments to min; returning Inf

请注意,对于 mean,您不会收到警告:

mean(numeric(0))
[1] NaN

这只是一个警告,对计算没有任何影响。您可以使用suppressWarnings 抑制它:

 suppressWarnings(dcast(data=molten.iris,
                  Species~variable,value.var="value",
                  fun.aggregate=min))

编辑

上面我只是在回答这个问题:警告的含义是什么?以及为什么我们有这个最小值/最大值而不是平均函数。为什么dcast 将聚合函数应用于长度为 0 的向量的问题,这只是一个 BUG,您应该联系包维护人员。我认为错误来自dcast内部使用的plyr::vaggregate函数,

plyr::vaggregate(1:3,1:3,min)
Error in .fun(.value[0], ...) : 
  (converted from warning) no non-missing arguments to min; returning Inf

特别是这行代码:

plyr::vaggregate
function (.value, .group, .fun, ..., .default = NULL, .n = nlevels(.group)) 

    ### some lines       
    ....
    ### Here I don't understand the meaning of .value[0]
    ### since vector in R starts from 1 not zeros!!!
    if (is.null(.default)) 
        .default <- .fun(.value[0], ...)
    
    ## the rest of the function 
    .....

【讨论】:

确实这也是我的评论 :) 但为什么它会应用于长度为 0 的数字呢?也可以通过使用例如避免警告。 fill = 0(或任何其他值),因为这不会将 fill 应用于长度为 0 的数字。 @konvas 是的。 OP 问题是I can't find anything that explains the warning message and I'm a bit confused about why I get it when I use max but not when I use mean 所以我正在回答这个问题。对于dcast 丑陋的行为,这肯定是一个BUG。 感谢您的编辑。我认为您的原始答案(如我上面的评论)部分回答了 OP 问题,但还不够深入。这就是我提供赏金的原因。在我看来,只是说min 会产生警告而mean 并不是一个完整的解释,所以我要找的是你在“编辑”中写的内容。再次感谢。 另一种摆脱警告的方法是定义RobustMax &lt;- function(x) if (length(x)&gt;0) max(x) else -Inf,然后使用它代替max @VictorKlos 运行良好且非常直接。谢谢。

以上是关于在 reshape2 中使用 min 或 max 时没有非缺失参数警告的主要内容,如果未能解决你的问题,请参考以下文章

不能在 Group by/Order by/Where/ON 子句中使用 Group 或 Aggregate 函数(min()、max()、sum()、count()、...等)

R语言使用Which.max和Which.min函数定位数据对象中的第一个最大值或最小值实战:使用which.max函数查找第一个最大值的索引使用which.min函数查找第一个最小值的索引

使用 where min/max laravel 获取所有行

在 postgresql 中使用 MIN, MAX, (SUM/COUNT) 子查询

@media min 和 max 两者或只有一个

我可以以某种方式从java中的Collections.Min / Collections.Max中排除或过滤掉一个值吗?