使用 filtering/matching 在 R 中交叉加入
Cross join in R with filtering/matching
我想在 R 中做一个交叉连接。如果我们没有条件,那么 data.table
包会做。但是 R 中这个 SQL 查询的等效项是什么?
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 列不是唯一的,结果集也没有唯一的行。
根据定义,您不能交叉连接索引,至少在 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)
第 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
我想在 R 中做一个交叉连接。如果我们没有条件,那么 data.table
包会做。但是 R 中这个 SQL 查询的等效项是什么?
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 列不是唯一的,结果集也没有唯一的行。
根据定义,您不能交叉连接索引,至少在 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)
第 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