2

假设我有一个看起来像这样的 R 数据框,其中end.group表示一组独特观察的结束:

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

2 回答 2

4

您可以group使用cumsum和创建rev。你需要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)
于 2012-07-26T14:56:24.860 回答
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
于 2012-07-26T15:00:48.337 回答