1. ホーム
  2. r

[解決済み】reshape2でminやmaxを使うと、引数が足りないという警告が出る。

2022-02-23 10:33:59

質問

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)
    )
})
#------------------------------------------------------------

解決方法は?

長さ0の数値引数に対してmin/maxを適用しているため、この警告が表示されます。

これにより、警告が再現されます。

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))

EDIT

上記は質問に答えただけです。この警告の意味は何なのか、なぜ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 
    .....
}