进行笛卡尔连接并使用前滚特征的最佳方法是什么,但是将滚动特征应用于连接表中的每个替代系列,而不是整个系列。
最好用一个例子解释:
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
我希望加入这些内容,以便x
中的每个 A
值我同时拥有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
答案 0 :(得分:4)
你走了:
setkey(B, f, x)
setkey(B[CJ(unique(f), unique(x)), allow.cartesian = T,
roll = T, rollends = c(F,F)], x)[A, allow.cartesian = T]
# x f z y
#1: 1 Alice 101 a
#2: 1 Bob 104 a
#3: 2 Alice 102 b
#4: 2 Bob 104 b
#5: 3 Alice 103 c
#6: 3 Bob 104 c
#7: 4 Alice NA d
#8: 4 Bob 105 d
#9: 5 NA NA e
您可以过滤掉NA
以满足您的需求。
答案 1 :(得分:3)
我还找到了另一种方法。我接受了另一个答案,因为它产生的结果更接近于问题所要求的结果,但这对某些人也可能有用。不同之处在于系列结束时发生的事情。
C = B[, .SD[A, roll = TRUE, rollends = FALSE], by = f]
setkey(C, x)
> C
f x z y
1: Alice 1 101 a
2: Bob 1 104 a
3: Alice 2 102 b
4: Bob 2 104 b
5: Alice 3 103 c
6: Bob 3 104 c
7: Alice 4 NA d
8: Bob 4 105 d
9: Alice 5 NA e
10: Bob 5 NA e
第9行& 10是唯一的区别;在eddi的答案中,这些组合成一行,两列都有NA
。
当我在更大的data.tables上测试时,这个解决方案也比eddi的稍慢一些(尽管两者都非常快)。