2012-05-09 6 views
4

単純な例。合計の代わりにキャスト/メルトを使ってパーセンテージのデータフレームを作成したいと思います。溶融/キャストを使用した合計の代わりにパーセンテージを作成

例。

eg <- data.frame(
Time = factor(c(1,2,1,2)), 
A1 = c(0, 0, 1, 1), 
A2 = c(1, 1, 1, 1), 
B1 = c(0, 0, 0, 0) 
) 

eg.m <- melt(eg,id="Time") 
eg.c <- cast(eg.m,Time ~ variable, sum, margins="grand_row") 

上記の例では、合計と合計を生成できます。合計を生成するのではなく、各セルのパーセンテージ、すなわちcell/gran_rowの合計を生成する手段がありますか?私はddplyを使ってここでいくつかのことをやり直すことができると知っていますが、より洗練されたソリューションがあるかどうか疑問に思っています。ここで

は私が探しているものの例です:

Time A1 A2 B1 
1 1 0.5 0.5 0 
2 2 1.0 1.0 0 
+0

最終的なdata.frameがどのように見えるかの例を投稿できますか? –

+0

私はそれを列の値の合計を合計で割ったものにしたいと思います。したがって、合計ではなく、cumsum/totalです。上記のデータを使用すると、列2またはA1の場合は0.5,1、列3またはA2の場合は0.5,1、列4の場合は0,0または – Dave

+0

@davewolfs @davewolfsコメントに説明する代わりにgsk3が要求したように質問の最後に実際にサンプルのデータフレームを追加する方が効率的でした。 – Dason

答えて

3

は、2つのステップでこれを行うことを避けるために、私には難しいようです。問題は、あなたが欲しいものを誤解していない限り、dcast操作の出力にcumsum/sum関数を実行したいということです。

まずあなたがそれを持っているようです。

eg.c <- dcast(eg.m,Time ~ variable, sum) 

第二には、単に列にCUMSUM/sum関数を適用している:

japplyは私.RProfileで持っている機能である
japply(eg.c, sapply(eg.c, is.numeric), function(x) cumsum(x)/sum(x)) 

    Time A1 A2 B1 
1 1 0.5 0.5 NaN 
2 2 1.0 1.0 NaN 

# Takes a data.frame and returns a data.frame with only the specified columns transformed 
japply <- function(df, sel, FUN=function(x) x, ...) { 
    df[,sel] <- sapply(df[,sel], FUN, ...) 
    df 
} 
関連する問題