R选择第一次出现的值

时间:2011-12-21 21:20:35

标签: r filtering state-machine

我需要在R中的数据集中选择特定值,并且无法弄清楚如何实际执行此操作。

(作为旁注:数据代表什么?)

这是连接到其他三个节点的网络节点的度量。 '时间'代表相对时间,(什么时候发生)。 '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

每一行都意味着系统中的“某些东西”发生了变化,但我必须过滤这些数据。 例如,一帧是:

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中正确地绘制这样的状态机是多少工作,我想我不能投入太多时间在它上面,而只是运行简单的数据绘图。

不幸的是,我无法估计会有多复杂。 也许有人可以启发我或者已经可以想象一个状态机并且有一些提示如何去做。

关于可视化状态的更多细节:

建议网络中有3个节点,应该连接。因此,每一行实际上代表了网络连接状态的变化。

执行的协议由三个协议阶段组成,需要为连接执行。

所以,例如像这样的一行:

4,1,0,0,1

表示从节点收到消息,现在继续执行协议。 接下来是:

100,0,1,0,1

如果此阶段成功,则会发生下一个协议阶段:

200,0,0,1,1

如果我们达到此状态,则对另一个节点进行身份验证,验证并连接。 正如您在我的示例数据中看到的那样,这些消息不会以任何有序的方式显示。 虽然从来没有过渡:

4,1,0,0,1

直接

200,0,0,1,1

来自其他节点的消息可以出现在任何其他消息之间。

这个有趣的部分实际上不是可视化,而是每个协议阶段转换所需的时间。这是我实际需要获取的数据。

在我写这篇文章时,我认为使用实际数据无法用当前信息将其可视化。

一种简单的方法是,为每个节点引入唯一标识符,并根据标识符和时间对列表进行排序。然后我们自动得到一个有序的列表,因为没有协议阶段可以跳过单个节点,所以它是根据时间正确排序的。因为每个节点本身都有固定的条目,我猜这些数据很容易计算和可视化。

我目前看不到别的方法,问题是,这些数据不是那么容易实现的,但如果我需要将其可视化,似乎我无法克服唯一标识符。

1 个答案:

答案 0 :(得分:1)

每次选择的列中存在非零差异时,您可以使用diff()函数和一些逻辑索引来获取第一行。例如,假设您的数据位于名为dat的数据框中:

> 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

尝试单独运行此部件以查看已创建的布尔值:c(dat$tm3[1], diff(dat$tm3)) != 0

上面的代码不会返回第一行,但如果您需要 - 请将布尔索引更改为:dat[c(TRUE, diff(dat$tm3)) != 0,]

在crossValidated上也回答了here