2012-02-01 22 views
0

はとても良い、これまでのところ、次の例as.formula '='(オブジェクトが見つかりません)

df1 <- data.frame(a=c(1,2,3),b=c(2,4,6)); 
transform(df1,c=a+b) 
    a b c 
    1 1 2 3 
    2 2 4 6 
    3 3 6 9 

に検討します。左手と右手側のセパレータとして「〜」

transform(df1,as.formula("c=a+b")) 

ただし、Rは

Error in eval(expr, envir, enclos) : object 'b' not found 

は、このエラーは使用して発生していないと言う:今私はas.formulaを使用して、動的にこれをコーディングしたいと思います。私は何とか数式の評価を遅らせることができますか?代入にas.formulaを使用することは可能ですか?私は 'with'で回り込んでみたが役に立たなかった。

+0

あなたはそれらを式ではなく「式」にしたいと思っています。しかし、 'eval(parse(text =" whatever "))'にいくつかのバリエーションがあり、ひどい恐ろしいコードとバグを見つけにくいという結果に終わるようです。可能であれば、それほど巧妙ではないものを試してみてください。 –

+2

文字列を等号に分割する方がよいでしょう。左側には、 'df1 [[" c "]] < - something'のようなものがあります。 '' a + b ''から' df1'で評価されたものになるということは、 '' eval(parse(text = "a + b")、df1) 'または同様に醜いものを意味します。あなたが達成しようとしていることについてもっと詳しく教えて、代替案を考えるのを助けることをお勧めします。 –

+0

私の本当の問題では、それを自動的に行うことも重要ではありません。私はちょうど "XA [XOY] [ABC] _ [0-9] [0-9]"、例えば "XXA_05"というカテゴリに属する​​名前で、約50列あります。今、私は同じ "X [XOY]"タイプと同じ数字のすべての列、例えば "XXA_00"と "XXB_00"を平均して、これらの列の最初に保存したいと思います。 もちろん、これは右の列をグレープすることによって列レベルで行うこともできます。私は数式問題をアクロスに遭遇したばかりで、数式として実装できるかどうかを知りたいと思っています。 – Johannes

答えて

2

あなたのコメントにあなたが言った問題は解決しました。それはあなたの本当の目標だと思われます。これにより、元の質問からの数式の混乱を避けることができます。

データセットの再現可能なバージョン。

group_names <- apply(
    expand.grid("X", c("X", "O", "Y"), c("A", "B", "C"), "_", 0:9, 0:9), 
    1, 
    paste, 
    collapse = "" 
) 
n_groups <- 50 
n_points_per_group <- 10 
df1 <- as.data.frame(matrix(
    runif(n_points_per_group * n_groups), 
    ncol = n_groups 
)) 
colnames(df1) <- sample(group_names, n_groups) 

データフレームをロングフォーマットに変換します。 (ここではreshapeパッケージを使用してください。またstats::reshapeを使用することができます。)

melted_df1 <- melt(df1) 

、第2の文字と番号が一致し、あなたの基準に基づいてグループを定義します。 (ご希望の場合はplyr::ddply

melted_df1$group <- with(melted_df1, paste(
    substring(variable, 2, 2),  
    substring(variable, 5, 6), 
    sep = "" 
)) 

今の要約統計情報を取得するためにtapplyを呼び出します。

with(melted_df1, tapply(value, group, mean)) 
関連する問題