R:在组内运行已更改列值的总和

时间:2015-06-15 16:29:46

标签: r

我的数据如下:

df <- read.table(textConnection(
    "ID DATE    UNIT
100 1/5/2005    4
100 2/6/2006    4
100 3/7/2007    5
100 4/7/2008    5
100 5/9/2009    6
101 1/5/2005    1
101 2/6/2006    1
101 3/7/2007    1
101 4/7/2008    1
102 1/3/2010    3
102 4/5/2010    4
102 5/9/2011    3
102 6/7/2011    5
102 10/10/2012  5
103 1/5/2005    1
103 1/6/2010    2"),header=TRUE)

我希望按ID分组,按DATE对每个组进行排序,并创建另一个列,该列是每个给定ID变量的UNIT变量更改次数的运行计数。所以我想要一个看起来像这样的输出:

ID  DATE    UNIT    CHANGES
100 1/5/2005    4   0
100 2/6/2006    4   0
100 3/7/2007    5   1
100 4/7/2008    5   1
100 5/9/2009    6   2
101 1/5/2005    1   0
101 2/6/2006    1   0
101 3/7/2007    1   0
101 4/7/2008    1   0
102 1/3/2010    3   0
102 4/5/2010    4   1
102 5/9/2011    3   2
102 6/7/2011    5   3
102 10/10/2012  5   3
103 1/5/2005    1   0
103 1/6/2010    2   1

2 个答案:

答案 0 :(得分:1)

使用dplyr

首先我将您的DATE列转换为日期,假设它的格式为m / d / y(如果不是,请将"%m/%d/%Y"更改为"%d/%m/%Y"):

df$DATE <- as.Date(df$DATE, "%m/%d/%Y") 

现在代码:

library(dplyr)

df %>% group_by(ID) %>%
       arrange(DATE) %>% 
       mutate(CHANGES=c(0,cumsum(na.omit(UNIT!=lag(UNIT,1)))))

答案 1 :(得分:1)

您也可以在基数R中执行此操作,使用order对观察值进行排序,并使用ave计算分组值:

df$DATE <- as.Date(df$DATE, "%m/%d/%Y")
df <- df[order(df$ID, df$DATE),]
df$CHANGES <- ave(df$UNIT, df$ID, FUN=function(x) c(0, cumsum(diff(x) != 0)))
df
#     ID       DATE UNIT CHANGES
# 1  100 2005-01-05    4       0
# 2  100 2006-02-06    4       0
# 3  100 2007-03-07    5       1
# 4  100 2008-04-07    5       1
# 5  100 2009-05-09    6       2
# 6  101 2005-01-05    1       0
# 7  101 2006-02-06    1       0
# 8  101 2007-03-07    1       0
# 9  101 2008-04-07    1       0
# 10 102 2010-01-03    3       0
# 11 102 2010-04-05    4       1
# 12 102 2011-05-09    3       2
# 13 102 2011-06-07    5       3
# 14 102 2012-10-10    5       3
# 15 103 2005-01-05    1       0
# 16 103 2010-01-06    2       1