2012-01-24 3 views
0

この質問は、previous questionとほぼ同じですが、その質問に対する回答がここではうまくいきません。最後の質問で@chaseと同様に、私は以下のフォーマット(カスタムfasta)でデータフレームの分割ごとに複数のファイルを書きたいと思います。d_plyで複数のカスタムファイルを書き込む

#same df as last question 

df <- data.frame(
    var1 = sample(1:10, 6, replace = TRUE) 
    , var2 = sample(LETTERS[1:2], 6, replace = TRUE) 
    , theday = c(1,1,2,2,3,3) 
)  

#how I want the data to look 
write(paste(">", df$var1,"_", df$var2, "\n", df$theday, sep=""), file="test.txt") 

#whole df output looks like this: 
#test.txt 
>1_A 
1 
>8_A 
1 
>4_A 
2 
>9_A 
2 
>2_A 
3 
>1_A 
3 

しかし、データフレーム全体からの出力を取得する代わりに、データのサブセットごとに個別のファイルを生成する必要があります。次のようにd_plyを使用する:

d_ply(df, .(theday), function(x) write(paste(">", df$var1,"_", df$var2, "\n", df$theday, sep=""), file=paste(x$theday,".fasta",sep=""))) 

私は、次の出力誤差取得:この問題を回避する方法について

Error in file(file, ifelse(append, "a", "w")) : 
    invalid 'description' argument 
In addition: Warning messages: 
1: In if (file == "") file <- stdout() else if (substring(file, 1L, : 
    the condition has length > 1 and only the first element will be used 
2: In if (substring(file, 1L, 1L) == "|") { : 
    the condition has length > 1 and only the first element will be used 

任意の提案を?

おかげで、 zachcp

答えて

3

あなたのコードには二つの問題がありました。

  • まず、ファイル名を構築する上で、あなたはpaste()にベクトルx$thedayを可決しました。 x$thedayはdata.frameの列から取られているので、多くの場合1つ以上の要素があります。あなたが見たエラーは、file=引数にいくつかのファイル名を渡したときに、write()という文句がありました。代わりにunique(x$theday)を使用すると、1つ以上のファイル名ではなく1つのファイル名だけを貼り付けることができます。

  • 第二に、あなたはそれを見ることが十分に得られなかったが、あなたはおそらく、それぞれのファイルにではなくdfの全体の内容よりも、x(data.frameの現在のサブセット)の内容を書きたいです。

ここには修正されたコードがありますが、これは問題なく動作します。

d_ply(df, .(theday), 
    function(x) {write(paste(">", x$var1,"_", x$var2, "\n", x$theday, sep=""), 
         file=paste(unique(x$theday),".fasta",sep="")) 
    }) 
+0

すばらしく素晴らしい。 – zach

+0

@zach - ありがとう。私はすぐに、デバッグを容易にする無名関数( 'function(x){browser(); write .....}')の本体に 'browser()'呼び出しを置きます。そうすることで、環境や計算の各部分をあなたのレジャーで見て調べることができ、何が間違っているのかを素早く確認することができます。 –

+0

良いヒント!ありがとう – zach