与dplyr"其他然后"汇总。组

时间:2016-04-06 11:48:54

标签: r dplyr group-summaries

我需要在分组的data_frame中进行总结(警告:dplyr的解决方案非常受欢迎,但并非强制性)每个组(简单)上的内容以及"其他&#34上的相同内容;基团。

最小的例子

if(!require(pacman)) install.packages(pacman)
pacman::p_load(dplyr)

df <- data_frame(
    group = c('a', 'a', 'b', 'b', 'c', 'c'),
    value = c(1, 2, 3, 4, 5, 6)
)

res <- df %>%
    group_by(group) %>%
    summarize(
        median        = median(value)
#        median_other  = ... ??? ... # I need the median of all "other"
                                     # groups
#        median_before = ... ??? ... # I need the median of groups (e.g
                                 #    the "before" in alphabetic order,
                                 #    but clearly every roule which is
                                 #    a "selection function" depending
                                 #    on the actual group is fine)
    )

我的预期结果如下

group    median    median_other    median_before
  a        1.5         4.5               NA
  b        3.5         3.5               1.5
  c        5.5         2.5               2.5

我搜索过类似于&#34; dplyr汇总的Google字符串&#34;,&#34; dplyr汇总其他组&#34;,我已经搜索了dplyr文档但是我无法找到解决方案。

这里,这个(How to summarize value not matching the group using dplyr)不适用,因为它只在sum上运行,即是一个解决方案&#34;功能特定的&#34; (并且使用一个简单的算术函数,不考虑每个组的可变性)。那么更复杂的功能请求(即均值,sd或用户功能)呢? : - )

感谢所有

PS:summarize()就是一个例子,同样的问题会导致mutate()或其他基于群组的dplyr函数。

2 个答案:

答案 0 :(得分:2)

我认为通常不可能在summarise()内对其他群组执行操作(即我认为其他群组不是&#34;可见&#34;在总结某个群组时) 。您可以定义自己的函数并在mutate中使用它们以将它们应用于某个变量。有关更新的示例,您可以使用

calc_med_other <- function(x) sapply(seq_along(x), function(i) median(x[-i]))
calc_med_before <- function(x) sapply(seq_along(x), function(i) ifelse(i == 1, NA, median(x[seq(i - 1)])))

df %>%
    group_by(group) %>%
    summarize(med = median(value)) %>%
    mutate(
        med_other = calc_med_other(med),
        med_before = calc_med_before(med)
    )
#   group   med med_other med_before
#   (chr) (dbl)     (dbl)      (dbl)
#1     a   1.5       4.5         NA
#2     b   3.5       3.5        1.5
#3     c   5.5       2.5        2.5

答案 1 :(得分:1)

这是我的解决方案:

res <- df %>%
  group_by(group) %>%
  summarise(med_group = median(value),
            med_other = (median(df$value[df$group != group]))) %>% 
  mutate(med_before = lag(med_group))

> res
Source: local data frame [3 x 4]

      group med_group med_other med_before
  (chr)     (dbl)     (dbl)      (dbl)
1     a       1.5       4.5         NA
2     b       3.5       3.5        1.5
3     c       5.5       2.5        3.5

我试图提出一个全面的解决方案,但基础R子集与median(df$value[df$group != group])一起正常工作,返回当前组中不存在的所有观察的中位数。

我希望这有助于您解决问题。