4

简单的例子。我想使用 cast/melt 而不是总和来创建一个百分比数据框。

例子。

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")

在上面的例子中,我可以产生总和。除了产生总和之外,是否有一种方法可以产生每个单元格中的百分比,即单元格/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

对我来说似乎很难避免分两步这样做。问题是您想在 dcast 操作的输出上运行 cumsum/sum 函数,除非我误解了您仍然想要什么。

首先是你所拥有的:

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

其次是将 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 回答