dplyr从滞后组中获取组级变量

时间:2018-08-06 04:18:39

标签: r dplyr

比方说,我有一个包含组的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

2 个答案:

答案 0 :(得分:3)

这里是一个选项。关键是使用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

答案 1 :(得分:1)

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

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

但是,如果像这样使用join,可能更容易看到正在发生的事情 @www's answer

reprex package(v0.2.0.9000)于2018-08-06创建。