1

次のようなデータセット「Stops」があります。

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

startno に「1」が含まれているかどうかに応じて、各 ID の最初または最後のレコードから開始するカウンターを追加したいと思います。

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は、一度に 1 つのグループを考えて、「グループの長さ」とまったく同じ長さのベクトルを返すことを認識する必要があります。実装は非常に簡単です。

于 2013-09-12T19:34:33.567 に答える
0

IDおよびstartno(逆)に従ってデータフレームをソートしてみませんか?その後、以下を適用できます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 に答える