【问题标题】:Calculating percent of row total with plyr用 plyr 计算行总数的百分比
【发布时间】:2009-11-23 19:13:26
【问题描述】:

我目前在融化的表上使用cast 来计算 ID 变量 ID1(行名)和 ID2(列标题)的组合中每个值的总和,以及使用 margins="grand_col" 的每一行的总计.

c <- cast(m, ID1 ~ ID2, sum, margins="grand_col")

  ID1      ID2a  ID2b     ID2c     ID2d   ID2e    (all)
1  ID1a  6459695  885473  648019  453613 1777308 10224108
2  ID1b  7263529 1411355  587785  612730 2458672 12334071
3  ID1c  7740364 1253524  682977  886897 3559283 14123045

到目前为止,像 R 一样。

然后我将每个单元格除以其行总数得到总数的百分比。

c[,2:6]<-c[,2:6] / c[,7]

这看起来很笨拙。我应该在castplyr 中做些什么来处理第一个命令中的保证金计算百分比?

谢谢, 马特

【问题讨论】:

  • 我在这里没有什么好主意。我希望其他人会这样做!

标签: r


【解决方案1】:

假设您的源表如下所示:

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

先使用ddply计算百分比,再使用cast以所需格式呈现数据

library(reshape)
library(plyr)

df1 <- ddply(dfm, .(ID1), summarise, ID2 = ID2, pct = value / sum(value))
dfc <- cast(df1, ID1 ~ ID2)

dfc
   ID1      ID2a       ID2b       ID2c       ID2d      ID2e
1 ID1a 0.6318101 0.08660638 0.06338147 0.04436700 0.1738350
2 ID1b 0.5888996 0.11442735 0.04765539 0.04967784 0.1993399
3 ID1c 0.5480662 0.08875735 0.04835905 0.06279786 0.2520195

与您的示例相比,这缺少行总计,需要单独添加。

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

【讨论】:

  • 这是一个更好的解决方案,如果只是因为列索引不需要硬编码,而且我可以在没有列总计的情况下生活。检查为答案。同时,您的 ddply 命令中的 ID2=ID2 参数发生了什么?
  • ddply 的 summarise 参数创建一个新的数据框,如果没有指定 ID2,新的数据框将只有两列 - ID1 和 pct。
【解决方案2】:

这是使用tapplyprop.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 )

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2018-04-19
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多