首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >roll=TRUE与allow.cartesian=TRUE的结合

roll=TRUE与allow.cartesian=TRUE的结合
EN

Stack Overflow用户
提问于 2014-04-04 12:53:05
回答 2查看 446关注 0票数 5

做笛卡儿连接和使用前滚特性的最佳方法是什么,但将滚动特性应用于连接表中的每个替代系列,而不是整个系列。

最好用一个例子来解释:

代码语言:javascript
复制
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

我们有两张起跑表:

代码语言:javascript
复制
> 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

我想加入其中,这样我就可以为中的AAliceBob行中的每个 x值提供,如果两者都缺少,则向前滚动(但不要滚动到末尾)。这不太有效,因为我现在已经得到它:

代码语言:javascript
复制
> 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的数据。我需要鲍勃的额外行,所以我想要:

代码语言:javascript
复制
> 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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-04 15:28:14

给你:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2014-04-04 16:56:48

我还找到了一种替代的方法。我已经接受了另一个答案,因为这会产生一个更接近于问题所要求的结果,但这对一些人来说也可能是有用的。不同的是在系列赛结束时发生了什么。

代码语言:javascript
复制
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稍慢一些(尽管两者都相当快)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22863414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档