Rの中の2つの整数を比較する:「短いオブジェクト長さの倍数ではない長いオブジェクト長」ddply

2つの整数を比較して、ユーザ定義関数の中でデータフレームをサブセット化するときに、Rの中で、より短いオブジェクト長の倍数ではなく、より長いオブジェクト長を警告します。

ユーザ定義関数は、データフレームから取った整数のサブセットの中央値を返します。

function(s){ 
    return(median((subset(EDB,as.integer(validSession) == as.integer(s)))$absStudentDeviation))
}

(私はもともと as.integer 型変換を持っていませんでした。私はそこにデバッグとテキストを入れましたが、まだエラーが出ています)。

具体的なエラーは次のとおりです。

as.integer(validSession)== as.integer(s):   長いオブジェクトの長さは短いオブジェクトの長さの倍数ではありません

電話をすると、この警告が50回以上表示されます。

mediandf <- ddply(mediandf,.(validSession),
                           transform,
                           grossMed2 = medianfuncEDB(as.integer(validSession)))

目的は、大規模なデータフレームEDB内の特定のvalidSessionに関連付けられた$ validSessionの中央値を計算し、そのベクトルをmediandfに添付することです。

私は、実際には、 is.integer(validSession)でサブセット化することによって、mediandfデータフレームとEDBデータフレームの両方でvalidSessionのすべての値が整数であることを二重チェックしました。

さらに、このコマンドは実際に私が意図していることを実行しているように見えますが、検証していない値でデータフレームに新しい列が表示されますが、警告を理解したいと思います。 "medianfuncEDB"が整数として入力されて呼び出されている場合、 s == validSession が呼び出されたときに、なぜ「長いオブジェクトの長さが短いオブジェクト長の倍数ではありませんか?

medianfuncEDB(5)のような単純な関数呼び出しは何の問題もなく動作するので、なぜddplyを使用すると警告が出るのでしょうか?

編集:私はジョランのコメントの助けを借りて問題を発見した。私はその変換がvecotrs全体に関数に与えられたことは知らなかった。代わりにvalidSession [1]を使用すると警告が表示されませんでした。

1
ジョラン、私は何がうまくいくのかを誤解しているに違いない。私はそれがデータを変換するときに行ごとに動作すると仮定していました。関数medianfuncDBは、整数のベクトルではなくむしろ整数をとることを意図しているので、私の考えでは、 "s"と "validSession"の両方が比較されるときにベクトルではなく整数です。おそらく私はここで "変換"がどのように機能するかについて何か不足しています。
追加された 著者 David R,
さて、単純なエラーのように私はベクトル全体が私の機能に供給されていることに気づいていないということです。私はRの新機能であり、変換関数は各行で別々に動作すると考えました。したがって、「validSession」は(この行のvalidSession値)「データフレームのこのパーティションのvalidSessionベクトル全体」ではありません。
追加された 著者 David R,
私はそれをvalidsession [1]に変更すると思います。 (すべてのvalidSession値は、データフレームのそのセグメントで同じです)。
追加された 著者 David R,
いくつかのサンプルデータを提供できますか?
追加された 著者 Chase,
私は答えるよりもむしろコメントしています。これは再現可能な例がなければ対処するのが難しいでしょうから。しかし、強制( as.integer )に関連する可能性は低いです。 validSessionは常にsと正確に同じ長さになりますか?おそらく、 == ではなく%in%を使用することを意図していましたか?
追加された 著者 joran,
@DavidR解答としてあなたの解説を自由に追加し、それを受け入れてください。そうすれば、人々はこの問題が解決されたことを一目で見ることができます。
追加された 著者 joran,
デバッグツール( stackoverflow.com/questions/1882734/… )、あなたはあなたのデータが実際のものとどのように見えるかを比較することができます。具体的には、オプションを設定してみてください(error = recover)。
追加された 著者 Ari B. Friedman,

1 答え

ddply 関数は、既に validSession でデータフレームのサブセットを設定しています。したがって、 transform には、特定の validSession に対応するすべての行を含むデータフレームのみが供給されます。

つまり、 unique(mediandf $ validSession)の各 s に対して、 transform に既に subset(mediandf、validSession == s) )

サブセッティングを行う必要がないので( ddply はそのことを考慮します)、次の作業が必要です。

ddply(mediandf,.(validSession),transform,grossMed2=median(absStudentDeviation))

そして、あなたが望む値で新しい列 grossMed2 をつけて mediandf を取り戻すでしょう(したがって、それは各一意の validSession コード>)。

2
追加された
あなたの答えをありがとうが、これは正しい値を与えることはありません。私は別のデータフレーム(mediandfではなくEDB)からの値の中央値を探しています。私は、問題は単純に私はトランスフォームが私は唯一の整数を引数として受け取ることを意図した私のudfにベクトル全体を供給することを認識していないと思う。
追加された 著者 David R,
ああ、私は今理解しています。私は同意します - あなたは medianfuncEDB の中で print(s)を試して、それぞれの関数呼び出し内ですべて同じであることを確認することができます。 as.integer(s)[1] のようなものです。
追加された 著者 mathematical.coffee,