3

我需要在分组的 data_frame 中进行总结(警告:非常感谢使用 dplyr 的解决方案,但不是强制性的)每个组(简单)和“其他”组上的相同内容。

最小的例子

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

我搜索了类似于“dplyr 汇总排除组”、“dplyr 汇总其他组”的 Google 字符串,我搜索了 dplyr 文档,但找不到解决方案。

在这里,这个(如何使用 dplyr 总结与组不匹配的值)不适用,因为它仅在 sum 上运行,即是一个“特定于函数”的解决方案(并且具有一个简单的算术函数,它不考虑每个组的可变性)。更复杂的函数请求(即 mean、sd 或 user-function)呢?:-)

谢谢大家

PS:summarize()是一个例子,同样的问题导致mutate()或其他 dplyr-functions 基于组工作。

4

2 回答 2

2

这是我的解决方案:

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

我试图提出一个全 dplyr 解决方案,但基本 R 子集可以很好地median(df$value[df$group != group])返回不在当前组中的所有观察值的中值。

我希望这可以帮助您解决问题。

于 2016-04-06T22:35:41.910 回答
2

我认为一般不可能对内部的其他组执行操作summarise()(即我认为在总结某个组时其他组不是“可见的”)。您可以定义自己的函数并在 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
于 2016-04-06T12:06:41.580 回答