【问题标题】:Finding mean of previous set of grouped data with dplyr使用 dplyr 查找前一组分组数据的平均值
【发布时间】:2016-05-24 19:27:14
【问题描述】:

这是我正在处理的一些数据的最小工作示例。

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

我想同时按“组”和“顺序”分组,然后找到“顺序”滞后的值的平均值。理想情况下,这会产生一个看起来像

的数据框
    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() 来引用前一组的方法。

任何帮助都会很棒。

谢谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

    【讨论】:

    • 一个 data.table 模拟(我认为):df[df[, mean(value), by=order][, v := shift(V1)], on="order", m := v, by=.EACHI]
    • @Frank,确实,非常好
    • 谢谢你们,这两种解决方案都能满足我的需要。
    【解决方案2】:

    我们可以使用base R 来做到这一点。以“顺序”创建vector of unique 元素。然后,循环遍历'Un1'中的元素序列,将'df'('x1')子集化,根据先前'value'元素的子集得到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) }))
    

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多