首页 文章

R:多列分组后的Dplyr滞后变量

提问于
浏览
0

我想在 Year, State, Tier, Group 分组后计算 score 差异 . 我的数据的程式化表示如下所示:

dat2 <- data.frame(
Year = sample(1990:1996, 10, replace = TRUE),
State = sample(c("AL", "CA", "NY"), 10, replace = TRUE),
Tier = sample(1:2),
Group = sample(c("A", "B"), 10, replace = TRUE),
Score = rnorm(10))

我尝试 mutategroup_by_.dots 然而它从下一个绝对值获得值(即分组似乎不起作用) . 我最感兴趣的是绘制年度差异(ala时间序列,即使有些年份是 NA ),所以这可以通过滞后或计算明年的分数来解决 .

Edit: 因此,如果数据集如下所示:

Year    State    Tier    Group    Score
1990    AL       1       A        75
1990    AL       2       A        100
1990    AL       1       B        5
1990    AL       2       B        10
1991    AL       1       A        95
1991    AL       2       A        80
1991    AL       1       B        5
1991    AL       2       B        15

期望的最终结果是:

Year    State    Tier    Group    Score   Diff
1991    AL       1       A        95      20     
1991    AL       1       B        5       0  
1991    AL       2       A        80      -20
1991    AL       2       B        15      5

1 回答

  • 3

    如果我理解正确,你试图在 Year, State, Tier, Group 的每个组合中计算 Score 的差异?据推测,您的数据将按时间顺序排序,以区分任何意义 . 您的示例很小,可以重复这些组合,但我相信您正在寻找的解决方案是:

    library(dplyr)
    dat2 %>% 
     arrange(Year) %>%
     group_by(State, Tier, Group) %>%
     mutate(ScoreDiff = Score - lag(Score))
    

    使用您当前的代码, ScoreDiff 列有很多 NAs 因为通常赢得't be multiple cases of the same combination of your four variables in just 10 cases. But you can try it with a more general code (I' ve也将起始年份从1990年改为1890年):

    n <- 100
    
    dat2 <- data.frame(
      Year = sample(1890:1996, n, replace = TRUE),
      State = sample(c("AL", "CA", "NY"), n, replace = TRUE),
      Tier = sample(1:2),
      Group = sample(c("A", "B"), n, replace = TRUE),
      Score = rnorm(n))
    
    dat2 %>%
      arrange(Year) %>%
      group_by(State, Tier, Group) %>%
      mutate(ScoreDiff = Score - lag(Score))
    

相关问题