2017-07-02 57 views
0

我想在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

你能展示什麼是期望的結果嗎? –

回答

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

你好,謝謝你的發帖。這大概是我認爲會做的伎倆,它不適合我。當我運行較長時間的樣本時,如果同一年份/州/級/組合有兩個條目,它只會計算差異 - 所以它不會滯後於分數,但只能操作重複數據。 – rfsrc

+0

你說得對。因爲'Year'包含在分組中,它會查找包含相同'年份'的相同組合。我已經編輯了相應的答案,上面的代碼現在應該產生你想要的結果。 – Constantinos