【问题标题】:dplyr get a group-level variable from the lagged groupdplyr 从滞后组中获取组级变量
【发布时间】:2018-08-06 21:10:56
【问题描述】:

假设我有一个带有组的 df 和一个像平均值这样的组级变量。如何生成一个变量,该变量是滞后组的组级平均值,其中该变量唯一具有 NA 的行是第一组中的那些?

例如:

df <- data_frame(group = c(1,1,2,2),
             grouped.mean = c(2.5,2.5,3.5,3.5))

# my attempt
df %<>%
  group_by(group) %>%
  mutate(lag.group.mean = lag(grouped.mean))

# A tibble: 4 x 3
# Groups:   group [2]
  group grouped.mean lag.group.mean
  <dbl>        <dbl>          <dbl>
1    1.         2.50          NA   
2    1.         2.50           2.50
3    2.         3.50          NA   
4    2.         3.50           3.50

期望的输出:

  group grouped.mean lag.group.mean
  <dbl>        <dbl>          <dbl>
1    1.         2.50          NA   
2    1.         2.50          NA
3    2.         3.50          2.50   
4    2.         3.50          2.50

谢谢!

编辑:更具挑战性的例子:

df <- data_frame(group = c(1,1,2,3,3,3),
                 grouped.mean = c(2.5,2.5,3.5,4.5,4.5,4.5))

预期输出:

  group grouped.mean lag.grouped.mean
  <dbl>        <dbl>            <dbl>
1    1.         2.50            NA   
2    1.         2.50            NA   
3    2.         3.50            2.50
4    3.         4.50            3.50
5    3.         4.50            3.50
6    3.         4.50            3.50

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一个选项。关键是使用distinct删除重复行,创建lag.group.mean列,然后left_join到原始数据框。

    library(dplyr)
    
    df <- data_frame(group = c(1,1,2,2),
                     grouped.mean = c(2.5,2.5,3.5,3.5))
    
    df2 <- df %>%
      distinct() %>%
      mutate(lag.group.mean = lag(grouped.mean)) %>%
      left_join(df, ., by = c("group", "grouped.mean"))
    df2
    # # A tibble: 4 x 3
    #   group grouped.mean lag.group.mean
    #   <dbl>        <dbl>          <dbl>
    # 1     1          2.5           NA  
    # 2     1          2.5           NA  
    # 3     2          3.5            2.5
    # 4     2          3.5            2.5
    

    【讨论】:

      【解决方案2】:

      滞后组值是每个组内的第一个全局滞后值:

      library(tidyverse)
      
      df <- data_frame(group = c(1, 1, 2, 3, 3, 3),
                       grouped.mean = c(2.5, 2.5, 3.5, 4.5, 4.5, 4.5))
      
      df %>% 
        mutate(lag.grouped.mean = lag(grouped.mean)) %>% 
        group_by(group) %>% 
        mutate(lag.grouped.mean = first(lag.grouped.mean))
      #> # A tibble: 6 x 3
      #> # Groups:   group [3]
      #>   group grouped.mean lag.grouped.mean
      #>   <dbl>        <dbl>            <dbl>
      #> 1     1          2.5             NA  
      #> 2     1          2.5             NA  
      #> 3     2          3.5              2.5
      #> 4     3          4.5              3.5
      #> 5     3          4.5              3.5
      #> 6     3          4.5              3.5
      

      但如果您使用类似 in 的连接,可能更容易看到发生了什么 @www's answer.

      reprex package (v0.2.0.9000) 于 2018 年 8 月 6 日创建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多