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 と reshape を使用していくつかのことができることはわかっていますが、もっとエレガントな解決策があるかどうか疑問に思っています。

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

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

1 に答える 1

3

これを2つのステップで行うのを避けるのは難しいようです。問題は、dcast 操作の出力に対して cumsum/sum 関数を実行したいということです。

最初はあなたが持っているとおりです:

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

2 つ目は、列に cumsum/sum 関数を適用するだけです。

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

japply.RProfile にある関数はどこにありますか:

# 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
}
于 2012-05-09T13:13:21.153 に答える