使用plyr计算行总数的百分比

使用plyr计算行总数的百分比,r,R,我目前正在对熔化的表使用cast来计算ID变量ID1(行名称)和ID2(列标题)组合处每个值的总和,以及使用margins=“grand\u col”计算每行的总计 c假设源表如下所示: dfm <- structure(list(ID1 = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("ID1a", "ID1b", "ID1c" ), class = "facto

我目前正在对熔化的表使用
cast
来计算ID变量ID1(行名称)和ID2(列标题)组合处每个值的总和,以及使用
margins=“grand\u col”
计算每行的总计


c假设源表如下所示:

dfm <- structure(list(ID1 = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("ID1a", "ID1b", "ID1c"
), class = "factor"), ID2 = structure(c(1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), .Label = c("ID2a", 
"ID2b", "ID2c", "ID2d", "ID2e"), class = "factor"), value = c(6459695L, 
7263529L, 7740364L, 885473L, 1411355L, 1253524L, 648019L, 587785L, 
682977L, 453613L, 612730L, 886897L, 1777308L, 2458672L, 3559283L
)), .Names = c("ID1", "ID2", "value"), row.names = c(NA, 
-15L), class = "data.frame")

> head(dfm)
   ID1  ID2   value
1 ID1a ID2a 6459695
2 ID1b ID2a 7263529
3 ID1c ID2a 7740364
4 ID1a ID2b  885473
5 ID1b ID2b 1411355
6 ID1c ID2b 1253524
与您的示例相比,这缺少行总计,需要单独添加


但是,不确定此解决方案是否比您目前拥有的解决方案更优雅。

这里有一个使用
tapply
prop.table
的单行程序。它不依赖任何辅助包:

prop.table(tapply(dfm$value, dfm[1:2], sum), 1)
给予:

      ID2
ID1         ID2a       ID2b       ID2c       ID2d      ID2e
  ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350
  ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399
  ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195
或者这个更短一些:

prop.table( xtabs(value ~., dfm), 1 )

我这里没有什么好主意。我希望其他人能做到!这是一个更好的解决方案,因为列索引不需要硬编码,而且我可以不使用列总数。检查作为答案。同时,ddply命令中的ID2=ID2参数中发生了什么?ddply的Summary参数创建了一个新的数据帧,如果未指定ID2,新的数据帧将只有两列—ID1和pct。
prop.table(tapply(dfm$value, dfm[1:2], sum), 1)
      ID2
ID1         ID2a       ID2b       ID2c       ID2d      ID2e
  ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350
  ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399
  ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195
prop.table( xtabs(value ~., dfm), 1 )