2015-10-05 59 views
1

我想在R中進行交叉加入。如果我們沒有條件,那麼data.table程序包將執行此操作。但是R中這個SQL查詢的等價物是什麼?交叉加入R與過濾/匹配

Select table1.value as value1, table2.value as value2 
from table1 cross join table2 where table1.id = table2.id 

考慮這個例子

table1: 
id value 
1 1 
1 2 
2 1 
3 1 
3 3 
3 4 

table2: 
id value 
1 5 
1 4 
2 1 
3 4 
3 3 

在這種情況下,我需要的輸出是:

value1 value2 
1  5 
1  4 
2  5 
2  4 
1  1 
1  4 
1  3 
3  4 
3  3 
4  4 
4  3 

請注意,無論是ID列是唯一的,也不是結果集特有的行。

回答

4

列value.x和value.y是什麼,你需要

table1 <- data.frame(id= c(1,1,2,3,3,3), value=c(1,2,1,1,3,4)) 
    table2 <- data.frame(id=c(1,1,2,3,3), value=c(5,4,1,4,3)) 
    merge(table1,table2,by="id",all.y=TRUE) 



    id value.x value.y 
1 1  1  5 
2 1  1  4 
3 1  2  5 
4 1  2  4 
5 2  1  1 
6 3  1  4 
7 3  1  3 
8 3  3  4 
9 3  3  3 
10 3  4  4 
11 3  4  3 
1

您不能按定義交叉連接索引,至少在R術語中不能交叉連接。你上面有什麼是內部連接。

library(dplyr) 

table1 %>% select(table1.value = value, id) %>% 
    inner_join(table2 %>% select(table2.value = value, id)) 

如果你想要,而不是什麼是能夠於交叉連接和過濾的同時,你可能要看一看data.table,因爲他們不能在dplyr結合。

table1 %>% select(table1.value = value, table1.id = id) %>% 
    merge(table2 %>% select(table2.value = value, table2.id = id)) %>% 
    filter(table1.id == table2.id) 
+4

我不明白你的答案。你在問嗎?我正在嘗試在R中執行此操作,而不是在SQL中執行此操作。 –

+0

您永遠無法在索引中以任何語言交叉連接。這是因爲交叉連接的定義是基於所有可能的組合進行連接而不考慮任何索引 – bramtayl

+0

您是我的朋友,完全缺乏交叉連接如何工作的任何知識。請閱讀此鏈接,並避免提供有關您不知道的事情的答案和評論:[link](https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljcrossjoin.html) –