如何左(或右)排除R中的连接?

时间:2018-01-30 13:06:54

标签: sql r join left-join

R的等价物是什么?

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

请参阅https://www.codeproject.com/articles/33052/visual-representation-of-sql-joins - '不包括加入'

我有两列数据:

A
Amsterdam
Copenhagen
LA
Lisbon
London 
Madrid
New York
Paris
Rome
Stockholm

B
Amsterdam
Buenos Aires  
Copenhagen
LA
London 
Sydney
Tokyo

如何退回列表:

In A ONLY
Lisbon
Madrid
New York
Paris
Rome
Stockholm

In B ONLY
Buenos Aires
Sydney
Tokyo

在R?

我一直在尝试使用merge()功能搜索解决方案大约三个小时。

同样,有没有办法在R中执行左连接,返回两个列?

例如,如果我打电话:

A <- data.frame(A = c("Amsterdam",
                      "Copenhagen",
                      "LA",
                      "Lisbon",
                      "London", 
                      "Madrid",
                      "New York",
                      "Paris",
                      "Rome",
                      "Stockholm"))

B <- data.frame(B = c("Amsterdam",
                      "Buenos Aires",
                      "Copenhagen",
                      "LA",
                      "London", 
                      "Sydney",
                      "Tokyo"))

merge(A, B, by.x = "A", by.y = "B", all.x = T)

我得到了

            A
1   Amsterdam
2  Copenhagen
3          LA
4      Lisbon
5      London
6      Madrid
7    New York
8       Paris
9        Rome
10  Stockholm

但我想要

            A   B
1   Amsterdam   Amsterdam
2  Copenhagen   Copenhagen
3          LA   LA
4      Lisbon   NULL
5      London   London 
6      Madrid   NULL
7    New York   NULL
8       Paris   NULL
9        Rome   NULL
10  Stockholm   NULL

5 个答案:

答案 0 :(得分:1)

## A only
setdiff(A,B)
[1] "Lisbon"    "Madrid"    "New York"  "Paris"     "Rome"      "Stockholm"

## B only
setdiff(B,A)
[1] "Buenos Aires" "Sydney"       "Tokyo" 

答案 1 :(得分:1)

我们在“B”中创建一个“A”列,然后执行merge

merge(A, transform(B, A = B), all.x = TRUE)
#            A          B
#1   Amsterdam  Amsterdam
#2  Copenhagen Copenhagen
#3          LA         LA
#4      Lisbon       <NA>
#5      London     London
#6      Madrid       <NA>
#7    New York       <NA>
#8       Paris       <NA>
#9        Rome       <NA>
#10  Stockholm       <NA>

答案 2 :(得分:1)

您可以执行以下操作:

df <- data.frame(A, B = "NULL", stringsAsFactors = FALSE)
isinB <- df$A %in% B$B
df[isinB, "B"] <- as.character(df[isinB, "A"])


print(df)
            A          B
1   Amsterdam  Amsterdam
2  Copenhagen Copenhagen
3          LA         LA
4      Lisbon       NULL
5      London     London
6      Madrid       NULL
7    New York       NULL
8       Paris       NULL
9        Rome       NULL
10  Stockholm       NULL

答案 3 :(得分:0)

用于将b中提到的城市从a中排除。 a是左表,b是右表。下面类似于左排除联接。 Left excluding join = Left join - inner join

a <- data.frame(a);
colnames(a) <- city;

b <- data.frame(b);
colnames(b) <- city;
b$indicator <- c("indicator");

a_excl_b <- merge(x = a, y = b, all = FALSE, all.x = TRUE, all.y = FALSE);
a_excl_b <- subset(a_excl_b, is.na(indicator));
a_excl_b <- data.frame(a_excl_b$city);
colnames(a_excl_b ) <- c("city");

答案 4 :(得分:0)

抱歉,我在这里的第一条评论,所以我不知道如何正确设置答案的格式,使其看起来像R一样

使用anti_join(A,B)和anti_join(B,A)。结果:

anti_join(A,B)
正在加入,由=“ Y”

1里斯本
2马德里
3纽约
4巴黎
5罗马
6斯德哥尔摩

anti_join(B,A)
正在加入,由=“ Y”

1布宜诺斯艾利斯
2悉尼
3东京

并通过匹配将它们两个合并:

aux <-inner_join(A,B)
aux2 <-anti_join(B,A)
i <-1:nrow(A)
c <-ifelse(A $ Y [i]%in%aux $ Y,A $ Y [i],“ NA”)
A <-cbind(A,c)
A <-rbind(A,data.frame(Y = rep(“ NA”,nrow(anti_join(B,A))),c = aux2 $ Y))
A
Y c
1阿姆斯特丹阿姆斯特丹
2哥本哈根哥本哈根
3 LA LA
4里斯本NA
5伦敦伦敦
6马德里NA
7纽约NA
8巴黎NA
9罗马NA
10斯德哥尔摩NA
11 NA布宜诺斯艾利斯
12 NA Sydney
13 NA东京