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

问题描述:

我想在Year, State, Tier, Group分组后计算score差异。我的数据的程式化的表述看起来像:R:由多列分组后的Dplyr滞后变量

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 
+0

你能展示什么是期望的结果吗? –

如果我理解正确的,你想计算的差异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)) 
+0

你好,谢谢你的发帖。这大概是我认为会做的伎俩,它不适合我。当我运行较长时间的样本时,如果同一年份/州/级/组合有两个条目,它只会计算差异 - 所以它不会滞后于分数,但只能操作重复数据。 – rfsrc

+0

你说得对。因为'Year'包含在分组中,它会查找包含相同'年份'的相同组合。我已经编辑了相应的答案,上面的代码现在应该产生你想要的结果。 – Constantinos