8

R を使用して、一意でない行名を持つテーブルの数値データを、カスタム関数を使用して要約された値を持つ一意の行名を持つ結果テーブルに要約したいと考えています。要約ロジックは次のとおりです。最小値に対する最大値の比率が 1.5 未満の場合は値の平均を使用し、それ以外の場合は中央値を使用します。テーブルが非常に大きいため、reshape2パッケージで Melt() および cast() 関数を使用しようとしています。

# 一意でない行名を持つテーブルの例
タブ <- data.frame(gene=rep(文字[1:3], each=3), s1=runif(9), s2=runif(9))
# 溶けた
tab.melt <-melt(タブ、id=1)
# ロジックで要約する関数: 最大/最小 < 1.5 の場合は平均、そうでない場合は中央値
要約 <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))}
# 集計値でキャスト
dcast(tab.melt, 遺伝子~変数, 要約)

上記のコードの最後の行は、エラー通知になります。

vapply(indices, fun, .default) のエラー:
  値は「論理」型でなければなりません。
 しかし、FUN(X[[1]]) の結果は 'double' 型です
さらに: 警告メッセージ:
1: max(x) : max に欠落していない引数はありません。-Inf を返す
2: in min(x) : min に欠落していない引数はありません。Inf を返す

私は何を間違っていますか?集計関数が単に min() または max() を返すだけの場合は、「欠落していない引数がない」という警告メッセージが表示されますが、エラーは発生しないことに注意してください。ご提案ありがとうございます。

(私が使用したい実際のテーブルは 200x10000 のものです。)

4

2 に答える 2

9

短い答え:次のように塗りつぶしの値を指定します acast(tab.melt,gene~variable,summary,fill=0)

長い答え: vaggregate 関数で vapply に渡される前に、関数が次のようにラップされているようです (dcast は、vapply を呼び出す vaggregate を呼び出すキャストを呼び出します)。

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 によってテンプレートとして使用される) である場合、double を返し始めると関数は失敗します。

于 2011-01-29T08:02:04.183 に答える
2

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

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

?dcastをご覧ください

次に、回避策を示します。

 dcast(tab.melt, gene~variable, summarize, fill=NaN)
于 2011-01-29T08:00:57.973 に答える