使用dplyr查找上一组分组数据的平均值

时间:2016-05-24 19:27:15

标签: r dplyr

以下是我正在使用的一些数据的最小工作示例。

set.seed(42)

value <- sample(1:10, 10)
group <- rep(700, each= 10)
order <- c(1,1,1,2,2,2,2,2,2,2)

df <- as.data.frame(cbind(value, group, order))

    value group order
1     10   700     1
2      9   700     1
3      3   700     1
4      6   700     2
5      4   700     2
6      8   700     2
7      5   700     2
8      1   700     2
9      2   700     2
10     7   700     2

我想和小组&#39;分组。和&#39;命令&#39;然后找到滞后于&#39; order&#39;的值的平均值。理想情况下,这会生成一个看起来像

的数据框
    value group order mean
1     10   700     1   NA
2      9   700     1   NA
3      3   700     1   NA
4      6   700     2  7.33
5      4   700     2  7.33
6      8   700     2  7.33
7      5   700     2  7.33
8      1   700     2  7.33
9      2   700     2  7.33
10     7   700     2  7.33

我使用dplyrgroup_by,但我无法找到使用mutatemean()来引用前一组的方法。

任何帮助都会很精彩。

谢谢

2 个答案:

答案 0 :(得分:5)

这有点棘手,因为一旦您按照某些变量对数据进行分组,就无法轻松访问其他群组。数据除非您引用原始数据集(例如再次使用df$...,但您再也没有找到正在寻找的正确群组)。我可能会有更直接的方法,但这里有一个潜在的基于dplyr的方法:

df %>% 
  group_by(group, order) %>%           # group the data
  summarise(mean = mean(value)) %>%    # summarise with mean per group & order
  mutate(mean = lag(mean)) %>%         # get the previous group's mean
  right_join(df)                       # join to original data

# Source: local data frame [10 x 4]
# Groups: group [?]
# 
#    group order     mean value
#    (dbl) (dbl)    (dbl) (dbl)
# 1    700     1       NA    10
# 2    700     1       NA     9
# 3    700     1       NA     3
# 4    700     2 7.333333     6
# 5    700     2 7.333333     4
# 6    700     2 7.333333     8
# 7    700     2 7.333333     5
# 8    700     2 7.333333     1
# 9    700     2 7.333333     2
# 10   700     2 7.333333     7

答案 1 :(得分:2)

我们可以使用base R执行此操作。在'order'中创建vector unique个元素。然后,循环遍历'Un1'中的元素序列,子集'df'('x1'),根据先前'value'元素的子集获取Mean值,创建一个'Mean'列在数据集中,rbind输出。

Un1 <- unique(df$order)
do.call(rbind,lapply(seq_along(Un1), function(i) {
      x1 <- df[df$order==Un1[i],]
      Mean=mean(df[df$order==Un1[i-1],1])
      transform(x1,Mean=Mean) }))