1

我有一个数据集“Stops”,如下所示:

ID    response    startno
1     Yes         1
1     Yes         
1     Yes       
1     No
2     Yes   
2     Yes
2     No
2     No          1

我想添加一个计数器,该计数器从每个 ID 的第一条或最后一条记录开始,具体取决于 startno 中的“1”:

ID    response    startno    counter
1     Yes         1           1
1     Yes                     2
1     Yes                     3
1     No                      4
2     Yes                     4
2     Yes                     3
2     No                      2
2     No          1           1

起始记录将始终是第一个或最后一个记录。我用它来获得前向计数:

Stops$counter<-ave(Stops$ID,Stops$ID,FUN=seq_along)

但是我不知道如何让它检查它应该前进还是后退。任何帮助深表感谢。

4

2 回答 2

0

那不就是:

 Stops$counter<-ave(Stops$ID,Stops$ID,
       FUN=function(x) if (x[1]=="1" ) { seq_along(x)} else {rev(seq_along(x))} )

> Stops
  ID response startno counter
1  1      Yes       1       1
2  1      Yes               2
3  1      Yes               3
4  1       No               4
5  2      Yes               4
6  2      Yes               3
7  2       No               2
8  2       No       1       1

与您一起编程时,ave您需要一次考虑一个组,并意识到您将重新计算与“组长度”一样长的向量,因此如果 seq_along 对简单情况有好处,那么使用 if 重新运行两个备选方案之一是实现起来很简单。

于 2013-09-12T19:34:33.567 回答
0

为什么不根据IDstartno(反转)对数据框进行排序?然后,您可以应用您的ave

within(Stops[order(Stops$ID, -Stops$startno),], counter <- ave(ID,ID, FUN=seq_along))

结果:

  ID response startno counter
1  1      Yes       1       1
2  1      Yes       0       2
3  1      Yes       0       3
4  1       No       0       4
8  2       No       1       1
5  2      Yes       0       2
6  2      Yes       0       3
7  2       No       0       4
于 2013-09-12T20:21:29.690 回答