【发布时间】:2020-07-26 03:38:33
【问题描述】:
我正在试图弄清楚如何根据 2 列的链接对 R 数据表进行排序。
这是我的示例 data.table。
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A')
, col1 = c(7521, 0, 7915, 5222, 5703)
, col2 = c(7907, 5703, 8004, 7521, 5222))
id col1 col2
1: A 7521 7907
2: A 0 5703
3: A 7915 8004
4: A 5222 7521
5: A 5703 5222
我需要从 col1 = 0 开始的行顺序。第 2 行中的 col1 值应该等于前一行中 col2 的值,以此类推。
此外,通常应该始终有一个匹配值来链接行顺序。但如果不是,它应该选择最接近的值(请参见下面的第 4 行和第 5 行)。
我正在寻找的结果如下所示:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
我想我可以编写一个疯狂的函数来做到这一点.. 但我想知道是否有一个优雅的 data.table 解决方案。
编辑
我更新了表格以包含一个带有重复行的附加 ID,以及一个唯一的源列:
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B')
, col1 = c(7521, 0, 7915, 5222, 5703, 1644, 1625, 0, 1625, 1625)
, col2 = c(7907, 5703, 8004, 7521, 5222, 1625, 1625, 1644, 1625, 1505)
, source = c('c', 'b', 'a', 'e', 'd', 'y', 'z', 'x', 'w', 'v'))
id col1 col2 source
1: A 7521 7907 c
2: A 0 5703 b
3: A 7915 8004 a
4: A 5222 7521 e
5: A 5703 5222 d
6: B 1644 1625 y
7: B 1625 1625 z
8: B 0 1644 x
9: B 1625 1625 w
10: B 1625 1505 v
ID 中可以有匹配的值。见上文第 7 行和第 9 行的 B。但是,这些数据的每一行都有一个唯一的来源。
期望的输出是:
id col1 col2 source
1: A 0 5703 b
2: A 5703 5222 d
3: A 5222 7521 e
4: A 7521 7907 c
5: A 7915 8004 a
6: B 0 1644 x
7: B 1644 1625 y
8: B 1625 1625 w
9: B 1625 1625 z
10: B 1625 1625 v
在输出中,匹配的行 8 和 9 可以是任意顺序。
谢谢!
【问题讨论】:
-
col2会在 ID 中有重复项吗?您的示例将按原样工作,但如果有更多行,col2将是 1625 或不匹配。 -
是的。不是我想到的。有关更多数据集详细信息,请参阅编辑后的帖子。
标签: r data.table