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

使用dplyr查找前一组分组数据的平均值,r,dplyr,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

下面是我正在处理的一些数据的一个最小工作示例

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
我使用的是
dplyr
groupby
,但我想不出一种方法来使用
mutate
mean()
引用上一组

任何帮助都会很好


谢谢

我们可以用
base R
完成这项工作。按“顺序”创建
元素的
向量
。然后,循环遍历“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) }))

Un1这有点棘手,因为一旦您通过某些变量对数据进行分组,您就无法轻松访问其他组的数据,除非您参考原始数据集(例如再次使用
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

一个数据表模拟(我想):
df[df[,mean(value),by=order][,v:=shift(V1)],on=“order”,m:=v,by=.EACHI]
@Frank,的确,非常好谢谢你们两位,这两种解决方案都满足了我的需要。
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