我目前在融化的表上使用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]
这看起来很笨拙。我应该在
cast
或plyr
中做一些事情来处理第一个命令中的 margin 计算百分比吗?谢谢,
马特
最佳答案
假设您的源表看起来像这样:
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
与您的示例相比,这缺少行总计,因此需要单独添加这些行。
但是,不确定这种解决方案是否比您目前拥有的解决方案更优雅。
关于r - 用plyr计算行总数的百分比,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1785320/