2011-01-29 1 views
8

Rを使用して、一意でないrownamesを持つテーブルの数値データを、一意の行名とカスタム関数を使用して集計した結果テーブルに要約したい。要約ロジックは、最大値と最小値の比が< 1.5の場合は平均値を使用し、それ以外の場合は中央値を使用します。テーブルが非常に大きいので、私はreshape2パッケージのmelt()とcast()関数を使用しようとしています。R reshape2のcast()呼び出しのカスタム集計関数でエラーが発生する

# example table with non-unique row-names 
tab <- data.frame(gene=rep(letters[1:3], each=3), s1=runif(9), s2=runif(9)) 
# melt 
tab.melt <- melt(tab, id=1) 
# function to summarize with logic: mean if max/min < 1.5, else median 
summarize <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))} 
# cast with summarized values 
dcast(tab.melt, gene~variable, summarize)

最後のコード行がエラー通知になります。

Error in vapply(indices, fun, .default) : 
    values must be type 'logical', 
but FUN(X[[1]]) result is type 'double' 
In addition: Warning messages: 
1: In max(x) : no non-missing arguments to max; returning -Inf 
2: In min(x) : no non-missing arguments to min; returning Inf 

私が間違って何をしているのですか?要約関数がmin()またはmax()を返すだけであった場合、 'no-missing arguments'に関する警告メッセージが表示されますが、エラーはありません。ご意見ありがとうございます。

は(私が仕事をしたい、実際のテーブルが200x10000 1である。)

答えて

2

dcast()デフォルト値で不足している組み合わせの値を設定しようとします。

fill引数でこれを指定できますが、fill = NULLの場合、 fun(0-lenght vector)(つまり、ここではsummarize(numeric(0))によって返された値がデフォルトとして使用されます。

ここでは、その後、

をdcastが回避策です参照してください?

dcast(tab.melt, gene~variable, summarize, fill=NaN) 
+0

これを調べて助けていただきありがとうございます。 – user594694

9

短い答え: acast(tab.melt、遺伝子〜変数を次のように塗りの価値を提供し、要約、塗りつぶし= 0)

長い答え: 次のように関数を呼び出しますvapply vaggregateを呼び出し、キャスト通話dcast vaggregate機能()にvapplyに渡される前に、包まれます表示されます。

fun <- function(i) { 
    if (length(i) == 0) 
     return(.default) 
    .fun(.value[i], ...) 
} 

.DEFAULTがどうあるべきかを知るためには、このコードは

if (is.null(.default)) { 
    .default <- .fun(.value[0]) 
} 

、すなわち.VALUE [0]関数に渡されて実行されます。 min(x)またはmax(x)は、xが数値(0)のときにInfまたは-Infを返します。しかし、max(x)/ min(x)は、クラスlogicalを持つNaNを返します。だから、vapplyは、デフォルト値のビーイングで

vapply(indices, fun, .default) 

を実行したとき(vapplyでテンプレートとして使用)クラスの論理でダブルスを返すために始めたときに、関数は失敗します。

+0

すばらしい説明! – hadley

+0

提案と説明をいただきありがとうございます。 dcast()呼び出しで 'fill'の値を指定した後、コードを動作させることができました。 – user594694

関連する問題