2011-12-18 5 views
1

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

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

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

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

私は取得しています特定のエラーがある:as.integerで

(validSession)== as.integer(S): リットルongerオブジェクトの長さが短く、オブジェクトの長さの倍数でない

私は50回以上、この警告が呼び出すときに取得:

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

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

実際には、mediandfデータフレームとEDBデータフレームの両方でvalidSessionの値がすべてis.integer(validSession)のサブセットで整数であることを再確認しました。

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

medianfuncEDB(5)のような単純な関数呼び出しは問題なく動作することに注意してください。なぜddplyを使用すると警告が表示されるのですか?

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

+0

サンプルデータを提供できますか? – Chase

+0

私は、答えるよりもむしろコメントしています。これは、再現可能な例がなければ対処するのが難しいためです。しかし、それは強制的に( 'as.integer')に関係することはまずありません。validSessionは常にsと正確に同じ長さになりますか?たぶん、あなたは '=='ではなく '%in%'を使うつもりでしょうか? – joran

+0

デバッグツール(http://stackoverflow.com/questions/1882734/what-is-your-favorite-r-debugging-trick/5156351#5156351)を使用している場合は、自分の考えているものを比較することができますそれが実際に何をしているかのように見えます。具体的には、オプションを設定してみてください(error = recover)。 –

答えて

2

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

つまり、transformは、それぞれssubset(mediandf,validSession==s)unique(mediandf$validSession)に入力しています。

あなたはどのサブセット化を行う必要はありません(ddplyは、そのの世話をする)、すべてを行う必要があるので:

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

そして、あなたは新しい列grossMed2mediandfバックを取得します必要な値を入力してください(したがって、それぞれ固有のvalidSession内の同じ値になります)。

+0

あなたの答えをありがとうが、これは正しい値を与えません。私は別のデータフレーム(mediandfではなくEDB)からの値の中央値を探しています。私は、問題は単純に私はトランスフォームが私は唯一の整数を引数として受け取ることを意図した私のudfにベクトル全体を供給することを認識していないと思う。 –

+0

ああ、私は今理解しています。私は同意します - あなたは 'medianfuncEDB'で' print(s) 'を試すことができます。これは各関数呼び出しの中でそれらが同じであることを確認するだけです(そうすべきです)。' as.integer(s)[ 1] 'となる。 –

関連する問題