R - 连续案例序列,其中 end1 == start2

3

拿这个数据集举例...

test <- data.frame(
    t1=c(2,3,5,6,7,10,10),
    t2=c(3,4,6,7,8,11,12),
    id=1:7
)

它看起来像这样。 为了澄清,每一行都是两个案例的先前确定的链接,它们必须保持绑定在一起。

  t1 t2 id
1  2  3  1
2  3  4  2
3  5  6  3
4  6  7  4
5  7  8  5
6 10 11  6
7 10 12  7

我希望能够基于t2 == t1的递归方法来确定连续的序列,使得链接变成如下格式:
link1 -  2-3,3-4
link2 -  5-6,6-7,7-8
link3 -  10-11
link4 -  10-12

The end result i'm looking for is this:

  t1 t2 id matchid
1  2  3  1       1
2  3  4  2       1
3  5  6  3       2
4  6  7  4       2
5  7  8  5       2
6 10 11  6       3
7 10 12  7       4

我曾尝试使用match(test$t2,test$t1)来获取初始链接,但现在卡在如何继续链接过程上。 我一直在考虑使用循环,但这听起来像一种可怕的方式。

一个建议。为什么不将t2向下偏移1,这样所有t1和t2相同数字的都会属于同一个id。 - RJ-
@RJ- 请看我澄清的内容 - 每行中的t1/t2组合是绑定在一起的,不能独立移动。 - thelatemail
1
我理解。这个移动是为了方便检查而进行的临时操作。想法是抵消、检查并生成一个新列来指示t1 == t2。所以,假设我使用YES表示t1 == t2,NO表示t1 != t2。之后,我使用运行长度编码(rle)来确定运行长度,并使用它来生成基于rle的递增ID。完成所有这些操作后,可以撤销偏移量。 - RJ-
1个回答

6
这里有一种方法可以实现:

这是其中一种可行的方式:

test$matchid <- c(1, 1 + cumsum(tail(test$t1, -1) != head(test$t2, -1)))

那太棒了,但你得向像我这样的蠢货解释清楚。 - thelatemail
2
嘿嘿,一步一步来就好了。我建议你先开始输入 tail(test$t1, -1) 看看它返回什么,然后是 head(test$t2, -1),再用 != 进行比较等等。你会发现这并不难。 - flodel
真是太棒了!比我想象的要好得多。 - RJ-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接