以下是我正在使用的一些数据的最小工作示例。
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
我使用dplyr
和group_by
,但我无法找到使用mutate
和mean()
来引用前一组的方法。
任何帮助都会很精彩。
谢谢
答案 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) }))