繁体   English   中英

使用融合/强制转换创建百分比而不是总和

[英]Creating Percentages instead of Sums using melt/cast

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

例。

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

我似乎很难避免两步这样做。 问题是你想在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是我在japply中的函数:

# 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM