2014-05-15 29 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 。也许这是你想要的。 –