一个人加入R

时间:2016-07-25 07:03:10

标签: r

有两个文件,数据如下:
file1

Col1   Col2  
**A**      10  
**B**      20   
**C**      30   
**D**      40  

file2:

Col1   col2   
**A**   XYZ  
**B**   PQR  
**B**   QES  
**C**   UIY  
**D**   UUI  
**D**   HUI  
**E**   BIG   

我想在col1 1上加入这两个文件,但我只想要那些只有一对一映射的条目。输出应如下所示:
文件A(我们匹配的地方)
     A 10 XYZ
     C 30 UIY

文件B(我们没有找到一对一的地图)

col1 col2
B 20
D 40

AS B和D在文件2中有多个条目,所以我不希望这些记录出现在我的连接结果中。

1 个答案:

答案 0 :(得分:2)

我们可以在对第二个数据集进行子集化后使用inner_join

library(dplyr)
df2 %>% 
   group_by(Col1) %>% 
   filter(n()==1) %>% 
   inner_join(., df1, by = "Col1")
#     Col1  col2  Col2
#   <chr> <chr> <int>
#1     A   XYZ    10
#2     C   UIY    30

或者避免重复元素,如@ zx8754建议

res <- df2 %>%
        inner_join(., df1, by = "Col1") %>%
        group_by(Col1) %>%
        filter(n()==1)

要获取不在&#39; res&#39;中的行,请执行anti_join

res %>%
    select(Col1, Col2) %>% 
    anti_join(df1, .)
#  Col1 Col2
#1    B   20
#2    D   40

或使用data.table

library(data.table)
na.omit(setDT(df2)[df1,  Col2 := Col2[.N==1],on = "Col1", by = .EACHI])
#   Col1 col2 Col2
#1:    A  XYZ   10
#2:    C  UIY   30