dplyr的相对频率,动态创建的列与每个组相关

时间:2015-11-30 13:26:43

标签: r dataframe dplyr summary group-summaries

关于为多个类别创建摘要列,我关注very useful solution。正如链接解决方案中所讨论的,我正在使用代码为每个子组生成百分比列。

来自链接解决方案的相关示例代码:

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中的值,正如所讨论的那样here,我会尝试执行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 | | -------------|-----------|-----------|-----------|-----------| 中执行此操作。

样本表

一般来说,我想创建一个类似下面的表:

$eventManager->attach(
        MvcEvent::EVENT_ROUTE,
        array($this, 'setBaseUrl'),
        -100
    );

    // Trigger before 404s are rendered.
    $eventManager->attach(
        MvcEvent::EVENT_RENDER,
        array($this, 'setBaseUrl'),
        -1000
    );

但我只对比例感兴趣而没有计数和总计以及其他小工具。

1 个答案:

答案 0 :(得分:1)

dplyr

@docendo discimus建立评论:

library(tidyr)
count(mtcars, am, gear) %>% 
  mutate(rel.freq = n/sum(n)) %>% 
  spread(gear, rel.freq) %>% 
  group_by(am) %>%
  summarize_each(funs(sum2 = sum(., na.rm = TRUE))) %>%
  mutate_each(funs(perc = paste0(round(100 * ., 0), "%")), -am, -n)

产地:

Source: local data frame [2 x 5]

     am     n     3     4     5
  (dbl) (int) (chr) (chr) (chr)
1     0    19   79%   21%    0%
2     1    13    0%   62%   38%

base

prop.table(table(mtcars$am, mtcars$gear), 1) %>% 
  round(2) %>% 
  '*'(100)

产地:

   3  4  5
0 79 21  0
1  0 62 38
相关问题