【发布时间】:2014-05-16 19:16:59
【问题描述】:
进行笛卡尔连接和使用前滚功能的最佳方法是什么,但将滚动功能应用于连接表中的每个替代系列,而不是整个系列。
最好用一个例子来解释:
library(data.table)
A = data.table(x = c(1,2,3,4,5), y = letters[1:5])
B = data.table(x = c(1,2,3,1,4), f = c("Alice","Alice","Alice", "Bob","Bob"), z = 101:105)
setkey(B,x)
C = B[A, roll = TRUE, allow.cartesian=TRUE, rollends = FALSE]
A
B
C[f == "Alice"]
C[f == "Bob"]
C
所以我们有两个起始表:
> A
x y
1: 1 a
2: 2 b
3: 3 c
4: 4 d
5: 5 e
> B
x f z
1: 1 Alice 101
2: 1 Bob 104
3: 2 Alice 102
4: 3 Alice 103
5: 4 Bob 105
我想加入这些,以便我有 每个 A 中的 x 值我同时拥有 Alice 和 Bob 行,如果其中一个缺失(但不会滚动到最后)。这并不像我目前得到的那样工作:
> C[f == "Alice"]
x f z y
1: 1 Alice 101 a
2: 2 Alice 102 b
3: 3 Alice 103 c
> C[f == "Bob"]
x f z y
1: 1 Bob 104 a
2: 4 Bob 105 d
> C
x f z y
1: 1 Alice 101 a
2: 1 Bob 104 a
3: 2 Alice 102 b
4: 3 Alice 103 c
5: 4 Bob 105 d
6: 5 NA NA e
因为 Alice 存在 2 和 3,所以它不会向前滚动 Bob 的数据。我需要 Bob 的额外行,所以我想得到:
> C[f == "Alice"]
x f z y
1: 1 Alice 101 a
2: 2 Alice 102 b
3: 3 Alice 103 c
> C[f == "Bob"]
x f z y
1: 1 Bob 104 a
2: 2 Bob 104 b # THESE ROWS ARE MISSING
3: 3 Bob 104 c # THESE ROWS ARE MISSING
4: 4 Bob 105 d
> C
x f z y
1: 1 Alice 101 a
2: 1 Bob 104 a
3: 2 Alice 102 b
4: 2 Bob 104 b # THESE ROWS ARE MISSING
5: 3 Alice 103 c
6: 3 Bob 104 c # THESE ROWS ARE MISSING
7: 4 Bob 105 d
8: 5 NA NA e
【问题讨论】:
标签: r join data.table cartesian-product