Предупреждение об отсутствии пропущенных аргументов при использовании min или max в reshape2

#r #aggregate-functions #reshape2

#r #агрегатные функции #reshape2

Вопрос:

Я получаю следующее предупреждение при использовании min или max в функции dcast из пакета reshape2. О чем это мне говорит? Я не могу найти ничего, что объясняло бы предупреждающее сообщение, и я немного смущен тем, почему я получаю его, когда использую max, но не когда я использую mean или другие агрегатные функции.

Предупреждающее сообщение:
In .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)
    )
})
#------------------------------------------------------------
  

Комментарии:

1. Причина, по которой это появляется при использовании min or max , но not mean , заключается в том, что mean не выдает предупреждение при применении к вектору длины 0. Если вы это сделаете dcast(data=molten.iris,Species~variable,value.var="value", function(x) {print(x); min(x)}) , вы увидите, что первым x является числовой вектор длиной 0. Поскольку fill=NULL in dcast по умолчанию, то min применяется к вектору длины 0 и выдает предупреждение. Вопрос в том, почему существует такой структурный шаблон, что первый возвращаемый элемент имеет вектор длины 0… Понятия не имею, почему это происходит, поскольку все комбинации факторов, похоже, существуют

Ответ №1:

Вы получаете это предупреждение, потому что min / max применяются к числовому аргументу длины 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))
  

Редактировать

Выше я просто отвечаю на вопрос: в чем смысл предупреждения? и почему у нас есть этот min / max, а не функция mean. Вопрос, почему dcast применяется агрегатная функция к вектору длины 0, это просто ОШИБКА, и вам следует связаться с сопровождающим пакета. Я думаю, что ошибка возникает из plyr::vaggregate -за функции, используемой внутри dcast ,

 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 
    .....
}
  

Комментарии:

1. Действительно, это был и мой комментарий 🙂 Но почему оно применяется к числовому значению длины 0? Этого предупреждения также можно избежать, используя, например fill = 0 , (или любое другое значение), поскольку оно не будет применяться fill к числовому значению длины 0.

2. @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 уродливого поведения это, безусловно, ОШИБКА.

3. Спасибо за вашу правку. Я думаю, что ваш первоначальный ответ (как и мой комментарий выше) частично ответил на вопрос OP, но недостаточно углубился. Вот почему я предложил награду. На мой взгляд, просто сказать, что min выдает предупреждение, а mean не нет, не было полным объяснением, поэтому я искал то, что вы написали в своем «РЕДАКТИРОВАТЬ». Еще раз спасибо.

4. Другой способ избавиться от предупреждений — определить RobustMax <- function(x) {if (length(x)>0) max(x) else -Inf} , а затем использовать это вместо max .

5. В чем именно причина того, что две функции в этих случаях только с NAs возвращают немного странное возвращаемое значение Inf for min и -Inf for max .