我正在关注为多个类别创建摘要列的非常有用的解决方案。如链接解决方案中所述,我正在使用为每个子组生成百分比列的代码。
链接解决方案中的相关示例代码:
mtcars %>%
group_by (am, gear) %>%
summarise (n=n()) %>%
mutate(rel.freq = paste0(round(100 * n/sum(n), 0), "%"))
该代码生成所需的值:
## Source: local data frame [4 x 4]
## Groups: am
##
## am gear n rel.freq
## 1 0 3 15 79%
## 2 0 4 4 21%
## 3 1 4 8 62%
## 4 1 5 5 38%
问题
我想修改此代码以动态创建与dplyr
调用中传递的第二个类别中可用的唯一类别相关的列。这将是gear
在所附示例的情况下。因此,在附加示例的情况下,生成的数据框将如下所示:
am gear n rel.freq_gear3 rel.freq_gear4 rel.freq_gear5
1 0 3 15 79% 21%
2 1 4 8 0 62% 38%
尝试
对于少数类别,我假设我可以使用 中的值的汇总conditionally
,如此处所讨论的,我将尝试dplyr
仅针对指定条件执行语句sumBfoo = sum(B[A=="foo"]))
。但是,这种方法在处理多个类别时效率低下。可以使用循环开发外部dplyr
解决方案并跳过所需类别的唯一值,但我希望在dplyr
.
样品表
从广义上讲,我想创建一个类似于下面的表:
library(gmodels)
CrossTable(mtcars$am, mtcars$gear)
Cell Contents
|-------------------------|
| N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 32
| mtcars$gear
mtcars$am | 3 | 4 | 5 | Row Total |
-------------|-----------|-----------|-----------|-----------|
0 | 15 | 4 | 0 | 19 |
| 4.169 | 1.371 | 2.969 | |
| 0.789 | 0.211 | 0.000 | 0.594 |
| 1.000 | 0.333 | 0.000 | |
| 0.469 | 0.125 | 0.000 | |
-------------|-----------|-----------|-----------|-----------|
1 | 0 | 8 | 5 | 13 |
| 6.094 | 2.003 | 4.339 | |
| 0.000 | 0.615 | 0.385 | 0.406 |
| 0.000 | 0.667 | 1.000 | |
| 0.000 | 0.250 | 0.156 | |
-------------|-----------|-----------|-----------|-----------|
Column Total | 15 | 12 | 5 | 32 |
| 0.469 | 0.375 | 0.156 | |
-------------|-----------|-----------|-----------|-----------|
但我只对行比例感兴趣,没有计数和总数以及其他小工具。