左连接仅使用merge()函数在R中选择的列

时间:2014-06-12 18:29:41

标签: r merge

我试图LEFT加入2个数据帧,但我不想加入第二个数据集中的所有变量:

例如,我有数据集1(DF1):

  Cl    Q   Sales  Date
   A    2   30     01/01/2014
   A    3   24     02/01/2014
   A    1   10     03/01/2014
   B    4   10     01/01/2014
   B    1   20     02/01/2014
   B    3   30     03/01/2014

我想离开联接数据集2(DF2):

Client  LO  CON
   A    12  CA
   B    11  US
   C    12  UK
   D    10  CA
   E    15  AUS
   F    91  DD

我可以使用以下代码离开联接:

merge(x = DF1,y = DF2,by =“Client”,all.x = TRUE):

   Client Q    Sales   Date             LO      CON
   A      2    30      01/01/2014       12      CA
   A      3    24      02/01/2014       12      CA
   A      1    10      03/01/2014       12      CA
   B      4    10      01/01/2014       11      US
   B      1    20      02/01/2014       11      US
   B      3    30      03/01/2014       11      US

但是,它合并了LO和CON列。我只想合并LO列。

   Client Q    Sales   Date             LO      
   A      2    30      01/01/2014       12      
   A      3    24      02/01/2014       12      
   A      1    10      03/01/2014       12      
   B      4    10      01/01/2014       11      
   B      1    20      02/01/2014       11     
   B      3    30      03/01/2014       11      

4 个答案:

答案 0 :(得分:81)

您可以通过将传递给合并的数据进行子集化来完成此操作:

merge(x = DF1, y = DF2[ , c("Client", "LO")], by = "Client", all.x=TRUE)

或者您可以在当前合并后删除该列:)

答案 1 :(得分:2)

我认为使用dplyr函数selectleft_join稍微简单一些;至少它让我更容易理解。来自dplyr的连接函数用于模仿sql参数。

 library(tidyverse)

 DF2 <- DF2 %<%
   select(client, LO)

 joined_data <- left_join(DF1, DF2, by = "Client")

您实际上并不需要使用&#34; by&#34;在这种情况下的参数,因为列具有相同的名称。

答案 2 :(得分:2)

没有什么优雅的,但这可能是另一个令人满意的答案。

merge(x = DF1, y = DF2, by = "Client", all.x=TRUE)[,c("Client","LO","CON")]

这将非常有用,特别是当您不需要在结果中用于联接表的键时。

答案 3 :(得分:0)

使用 left_join() 包中的 select()dplyr 的替代解决方案,无需中间步骤:

DF1 <- DF1 %>%
  left_join(DF2, by = "Client") %>%
  select(-CON)