2011-12-21 13 views
1

Rのデータセットで特定の値を選択する必要があり、実際にそれを行う方法を理解できません。R最初の値の出現を選択してください

(追記として:データが何を表してない)

これは、3つの他のノードに接続するネットワーク・ノードの測定値です。 '時間'は相対時間を表します(何かが起きたとき)。 'tm1、tm2、tm3'は、接続が現在どのプロトコル状態にあるかを示します。 'known'は、接続するノードの絶対数です。 (ここでは最大3)CSVなど、すべてのいくつかのテストデータの

まず:

time,tm1,tm2,tm3,known 
4,1,0,0,1 
12,2,0,0,2 
206,3,0,0,3 
238,2,1,0,3 
255,1,2,0,3 
297,1,1,1,3 
309,1,0,2,3 
401,0,1,2,3 
446,0,0,3,3 
3,1,0,0,1 
58,2,0,0,2 
235,1,1,0,2 
258,1,0,1,2 
320,0,1,1,2 
335,0,0,2,2 
874,1,0,2,3 
1024,0,1,2,3 
1030,0,0,3,3 
3,1,0,0,1 
20,2,0,0,2 
132,1,1,0,2 
151,1,0,1,2 
207,0,1,1,2 
228,0,0,2,2 
852,1,0,2,3 
929,0,1,2,3 
938,0,0,3,3 

各行は「何かが」システムに変更されていることが、私は、このデータをフィルタリングする必要があります。 例えば1つのフレームである:

time,tm1,tm2,tm3,known 
3,1,0,0,1 <- ignore 
20,2,0,0,2 <- ignore 
132,1,1,0,2 <- ignore 
151,1,0,1,2 <- select (first appearance of 1 in tm3) 
207,0,1,1,2 <- ignore 
228,0,0,2,2 <- select (first appearance of 2 in tm3) 
852,1,0,2,3 <- ignore 
929,0,1,2,3 <- ignore 
938,0,0,3,3 <- select (first appearance of 3 in tm3) 

選択したデータは、常に3、興味深いエントリーが含まれており、それぞれ「フレーム」は9行を保持している、これはすべて、いわゆるフレームについても同様です(あなたは時間があまりにジャンプするときことに気づくことができますCSVデータの値)

たぶん私はより多くのデータをプロットする必要がありますが、これはさらに複雑になると、私は私が正しく、このようなステートマシンをプロットすることができますかどうかはわかりません。 3つの "ノード"で動作することは、条件によって確実に管理できますが、6ノードと言うと、すぐに実行できます。私はRで相対的な新しいので、Rが正しい決定であるかどうか分からない、私はちょうどいくつかの測定データを素早くプロットしたいので、Rは完全に適合する。 しかし、このようなステートマシンをRに適切にプロットすることはどれくらいの労力を要していますか?それに多くの時間を投資することはできず、単純なデータプロットを実行することはできません。

残念ながら、私はそれがどれだけ複雑になるか推測できません。 はたぶん誰かが私を啓発することができ、または既にステートマシンを視覚化し、それを行うにはどのようにいくつかのヒントを持っていませんでした。

Aは、状態を可視化する上で詳細ビット:

接続する必要があり、ネットワーク内の3つのノードが、ある提案します。したがって、各行は実際にはネットワーク接続状態の変化を表します。

実行されるプロトコルは、接続のために実行される必要がある、3つのプロトコルの段階からなります。

4,1,0,0,1 

という意味は、ノードから受信したメッセージであり、今度はプロトコルに進みます。 次の行は、次にある:

100,0,1,0,1 

この段階が成功した場合、次のプロトコル段階が起こる:

200,0,0,1,1 

我々はこの状態に達した場合、他のノードは、認証確認して接続されています。 私のサンプルデータに見られるように、これらのメッセージは順不同で表示されます。 間の遷移が決してないが:他のノードからのメッセージが他のメッセージとの間に表示されることができる

200,0,0,1,1 

に直接

4,1,0,0,1 

は。

実際には視覚化ではなく、各プロトコルステージの移行にかかる時間です。これは私が実際に得る必要があるデータです。

私はこれを書いているので、実際のデータでは、これを現在の情報で視覚化することはできないと思います。

簡単な方法は、各ノードに固有の識別子を導入し、識別子と時間に基づいてリストをソートすることです。それで、プロトコル段階が単一のノードのために飛び越えることができないので、それは時間に基づいて正しく注文されるので、我々は自動的に幾分順序付けられたリストを得る。各ノード自体に固定されたエントリがあるため、これらのデータは簡単に計算して視覚化することができます。

現在のところ、このデータはそれほど簡単には達成できませんが、視覚化する必要がある場合は、一意の識別子を取得できないようです。

+0

私はstatemachine(s)に精通していませんが、あなたの質問は 'tm3'の値が変更されるたびに最初の行を選択することに沸きますか?それともそれ以上はありますか? – Chase

+0

はい、これは私の現在の問題の主要な部分です。 – evildead

+0

[Here](http://stackoverflow.com/documentation/r/9126/implement-state-machine-pattern-using-s4-class)では、RからのS4クラスを介してステートマシンパターンを使用してアプローチを見つけることができます。独自のソリューションを設計する際に役立ちます。 –

答えて

1

diff()関数と論理インデックスを使用して、選択した列にゼロ以外の差があるたびに最初の行を取得できます。たとえば、あなたのデータはdatという名前data.frameであると仮定すると:上記のコードは最初の行を返しませんc(dat$tm3[1], diff(dat$tm3)) != 0

、しかし:

> dat[c(dat$tm3[1], diff(dat$tm3)) != 0,] 
    time tm1 tm2 tm3 known 
6 297 1 1 1  3 
7 309 1 0 2  3 
9 446 0 0 3  3 
10 3 1 0 0  1 
13 258 1 0 1  2 
15 335 0 0 2  2 
18 1030 0 0 3  3 
19 3 1 0 0  1 
22 151 1 0 1  2 
24 228 0 0 2  2 
27 938 0 0 3  3 

して作成したブール値を見るためにそれ自体でこの部分を実行してみてくださいそれが必要な場合は、ブール値のインデックスを次のように変更してください。dat[c(TRUE, diff(dat$tm3)) != 0,]

また、crossValidatedのhereと回答しています。

+0

本当にありがとうございます。私は少し質問を開いてみましょう、多分私は私の他の質問への応答を得る。どうもありがとうございました! – evildead

+0

@evildead - 質問の2番目の部分、つまりステートマシンの視覚化を少し拡張できますか?それぞれの列を互いに独立して視覚化する必要がありますか?共同ですか?時間の経過とともに(または行ごとに暗示された時間)? – Chase

+0

私はそれについていくつかの情報を追加します。 – evildead

関連する問題