我希望在按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))
我尝试使用mutate
和group_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 :(得分: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))