使用dplyr计算先前分组数据的平均值

3
这是一份我正在处理的数据的最小工作示例。
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

我希望能按'group'和'order'分组,并找到'order'滞后的值的平均值。理想情况下,这将产生一个类似于以下数据框的结果:
    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个回答

6

这有点棘手,因为一旦你按某些变量对数据进行分组,除非你再次引用原始数据集(例如再次使用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

3
一个类似data.table的语法(我认为)是:df[df[, mean(value), by=order][, v := shift(V1)], on="order", m := v, by=.EACHI]。该语法会对数据框进行操作,通过按照"order"列分组并计算"value"列均值,然后给每个组中的元素添加一列“v”,其值为当前组中第一个元素的“V1”向上偏移一个位置的值。接着,对于每个“order”值,在原始数据框中匹配相应的行,并在这些匹配到的行中添加一列“m”,其值为对应行中“v”的值。 - Frank
@Frank,确实非常好。 - talat
谢谢你们两位,这两个解决方案都满足我的需求。 - Darin Self

2
我们可以使用基本的 R 语言来完成此操作。首先,在“order”中创建一个唯一元素的向量。然后,循环遍历“Un1”中的元素序列,对前面的“value”元素子集获取数据框“x1”的 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) }))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接