2016-05-16 25 views
1

如何編寫for循環或使用一個函數來檢查數據中的隨着時間的推移是否相等?在羣組內檢查一致性隨時間的變化

我有國會選區的時間序列數據的排列像下面的小片,但當然更多的數據:

dput(droplevels(head(CongressionalData[1:5],20))) 
structure(list(state_dist = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L), .Label = c("AK_1", 
"AL_1", "AL_2", "AL_3"), class = "factor"), electionyear = c(2002L, 
2004L, 2006L, 2008L, 2010L, 2002L, 2004L, 2006L, 2008L, 2010L, 
2002L, 2004L, 2006L, 2008L, 2010L, 2002L, 2004L, 2006L, 2008L, 
2010L), cong = c(108L, 109L, 110L, 111L, 112L, 108L, 109L, 110L, 
111L, 112L, 108L, 109L, 110L, 111L, 112L, 108L, 109L, 110L, 111L, 
112L), name = structure(c(6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 
1L, 3L, 3L, 3L, 2L, 4L, 5L, 5L, 5L, 5L, 5L), .Label = c("BONNER", 
"BRIGHT", "EVERETT", "ROBY", "ROGERS", "YOUNG"), class = "factor"), 
    republican = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("state_dist", 
"electionyear", "cong", "name", "republican"), row.names = c(NA, 
20L), class = "data.frame") 

我想只會使地區內比較,所以我要檢查如果一個地區在共和黨和民主黨代表之間切換。爲了簡單起見,我只想生成一個0或1的列表用於切換或不切換。我的第一個想法是一個for循環,如:

group1 <- c() 
for (i in 1:(nrow(CongressionalData) - 1)) { 
     if (CongressionalData$republican[i] == CongressionalData$republican[i+1]) { 
     group1 <- c(group1, 1) 
     } 
     else { 
     group1 <- c(group1, 0) 
     } 
    } 

但是,這比較每個地區上次選舉與下一個區的第一次選舉。

我在其他地方看到,這是很少使用的R中循環是個好主意,但我有什麼功能會在這裏工作很沒有意義。

回答

2

您可以使用data.table包進行此類轉換。既然你是比較行之間的列,您將需要shift函數產生共和列在這種情況下落後載體。然後Reduce函數與==將比較列的原始版本和滯後版本。如果它們相等,則返回true,否則返回false。 as.integer函數將邏輯值強制爲10

library(data.table) 
setDT(CongressionalData)[, group1 := as.integer(Reduce("==", shift(republican, n = 0:1, type = "lag"))), .(state_dist)] 
CongressionalData 
    state_dist electionyear cong name republican group1 
1:  AK_1   2002 108 YOUNG   1  NA 
2:  AK_1   2004 109 YOUNG   1  1 
3:  AK_1   2006 110 YOUNG   1  1 
4:  AK_1   2008 111 YOUNG   1  1 
5:  AK_1   2010 112 YOUNG   1  1 
6:  AL_1   2002 108 BONNER   1  NA 
7:  AL_1   2004 109 BONNER   1  1 
8:  AL_1   2006 110 BONNER   1  1 
9:  AL_1   2008 111 BONNER   1  1 
10:  AL_1   2010 112 BONNER   1  1 
11:  AL_2   2002 108 EVERETT   1  NA 
12:  AL_2   2004 109 EVERETT   1  1 
13:  AL_2   2006 110 EVERETT   1  1 
14:  AL_2   2008 111 BRIGHT   0  0 
15:  AL_2   2010 112 ROBY   1  0 
16:  AL_3   2002 108 ROGERS   1  NA 
17:  AL_3   2004 109 ROGERS   1  1 
18:  AL_3   2006 110 ROGERS   1  1 
19:  AL_3   2008 111 ROGERS   1  1 
20:  AL_3   2010 112 ROGERS   1  1 
+0

是的,這基本上是我在找的。你能解釋一下這段代碼在做什麼嗎?我希望能夠在未來使用這一戰略。 – ZLevine

+0

你應該把'library(data.table)'放在某個地方 – Frank

+1

@Frank,是的,只是添加了它。剛添加了解釋。希望這很清楚。 – Psidom