2014-05-15 30 views
-3

我有一個像計數的屬性水平的變化

ID YEAR_MONTH ATT_1 ATT_2 
1 201301  Y  1 
1 201302  Y  1 
1 201302  N  0 
1 201302  Y  0 
1 201303  N  1 
3 201301  N  1 
3 201302  N  0 
3 201302  Y  0 
3 201302  Y  1 
3 201303  Y  1 

我想最後的數據幀的數據幀的數量,這將看起來像

ID YEAR_MONTH YEARMONTH_LAG1 ATT1_CHNG ATT2_CHNG 
1 201301   NA   NA   NA 
1 201302   201301  0   0 
1 201303   201302  2   1 
3 201301   NA   NA   NA 
3 201302   201301  0   0 
3 201303   201302  1   1 

注:

  1. 'YEARMONTH_LAG1'是與當前月份對應的上個月。例如,如果YEAR_MONTH == 201301,那麼YEARMONTH_LAG1 = NA (因爲201212沒有記錄,並且在我的數據中沒有,因爲所有 從201201開始)。類似地,如果YEAR_MONTH == 201302然後 YEARMONTH_LAG1 = 201301.

  2. ATT1_CHNG是電平已經改變(即,從Y到N和副節)在上個月「ATT_1」(即次數,在 YEARMONTH_LAG1)

  3. ATT2_CHNG是倍的水平發生了變化(即,從0到1和副詩句)爲ATT_2比上月數量

這怎麼可能在R中完成?

+0

請閱讀[**這**](http://stackoverflow.com/help/on-topic)。 「詢問代碼的問題必須表明對所解決問題的最小理解,包括嘗試解決方案,爲什麼他們不工作,」 – Henrik

回答

1

dplyr

require(dplyr) 

df$ATT_1_New <- ifelse(df$ATT_1 == "Y", 1,0) 

df %.% 
    group_by(ID, YEAR_MONTH) %.% 
    mutate(ATT_1_CHNG = sum(abs(diff(ATT_1_New))), 
     ATT_2_CHNG = sum(abs(diff(ATT_2)))) %.% 
    group_by(ID, add=FALSE) %.% 
    mutate(YEARMONTH_LAG1 = lag(YEAR_MONTH, 1), 
     ATT_1_CHNG = lag(ATT_1_CHNG,1), 
     ATT_2_CHNG = lag(ATT_2_CHNG,1)) %.% 
    group_by(ID, YEAR_MONTH, add = FALSE) %.% 
    summarize(YEARMONTH_LAG1 = YEARMONTH_LAG1[1], 
      ATT_1_CHNG = ATT_1_CHNG[1], 
      ATT_2_CHNG = ATT_2_CHNG[1]) 


# ID YEAR_MONTH YEARMONTH_LAG1 ATT_1_CHNG ATT_2_CHNG 
#1 1  201301    NA   NA   NA 
#2 1  201302   201301   0   0 
#3 1  201303   201302   2   1 
#4 3  201301    NA   NA   NA 
#5 3  201302   201301   0   0 
#6 3  201303   201302   1   1 
+0

@beginnerR這工作正常。但是,如果我有幾列需要這樣做,那麼單獨輸入每個操作的每個列名稱會非常麻煩。有沒有一種替代的方式(像循環或東西)? – darkage

+0

@ darkage考慮接受你的問題的正確答案,以確認其他人處理它的時間。您可能需要查看dplyr 0.2中的新['summarize_each'函數](https://github.com/hadley/dplyr/blob/master/NEWS.md),您必須從GitHub安裝它,而不是CRAN 。也許這是你想要的。 –