2012-07-26 93 views
2

假设我为R数据框,看起来像这样,在end.group标志着一个独特的群体意见的结尾:在R中,我如何计算运行次数?

x <- data.frame(end.group=c(0,0,1,0,0,1,1,0,0,0,1,1,1,0,1)) 

我想回到以下,其中group.count是观测的数量的运行计数在一个组中,并且group是每个组的唯一标识符,按编号顺序。任何人都可以帮我用一段R代码来做到这一点?

end.group group.count group 
0   1   1 
0   2   1 
1   3   1 
0   1   2 
0   2   2 
1   3   2 
1   1   3 
0   1   4 
0   2   4 
0   3   4 
1   4   4 
1   1   5 
1   1   6 
0   1   7 
1   2   7 

回答

4

您可以通过使用cumsumrev创建group。您需要rev,因为您拥有组的终点。现在

x <- data.frame(end.group=c(0,0,1,0,0,1,1,0,0,0,1,1,1,0,1)) 
# create groups 
x$group <- rev(cumsum(rev(x$end.group))) 
# re-number groups from smallest to largest 
x$group <- abs(x$group-max(x$group)-1) 

可以使用ave创建group.count

x$group.count <- ave(x$end.group, x$group, FUN=seq_along) 
+0

谢谢约书亚 - 好东西! – Luke 2012-07-26 16:54:56

3
x <- data.frame(end.group=c(0,0,1,0,0,1,1,0,0,0,1,1,1,0,1)) 

ends <- which(as.logical(x$end.group)) 
ends2 <- c(ends[1],diff(ends)) 
transform(x, group.count=unlist(sapply(ends2,seq)), group=rep(seq(length(ends)),times=ends2)) 
    end.group group.count group 
1   0   1  1 
2   0   2  1 
3   1   3  1 
4   0   1  2 
5   0   2  2 
6   1   3  2 
7   1   1  3 
8   0   1  4 
9   0   2  4 
10   0   3  4 
11   1   4  4 
12   1   1  5 
13   1   1  6 
14   0   1  7 
15   1   2  7 
+0

干杯詹姆斯 - 像魅力一样工作。 – Luke 2012-07-26 16:55:28