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

时间:2017-07-02 19:59:55

标签: r dplyr

我希望在按score分组后计算Year, State, Tier, Group差异。我的数据的程式化表示如下:

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),所以这可以通过滞后或计算下一年的分数来解决。

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

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 个答案:

答案 0 :(得分:3)

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

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

根据您当前的代码,ScoreDiff列有很多NAs,因为在10个案例中,通常不会有四个变量的相同组合的多个案例。但你可以尝试使用更通用的代码(我也将起始年份从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))