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
答案 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东京