匹配数据框2列中的值并提取特定值

时间:2020-08-19 17:55:30

标签: r dataframe

我有一个数据帧,该数据帧由两组值组成,每组值具有3个属性(a1,a2,a3和b1,b2,b3)。我想将a1列的每个值与b1列的每个值进行比较,以找到可能的匹配项。如果有一场比赛,只有一场比赛。请注意,两组值a和b具有不同数量的观察值,因此a1,a2,a3将比b1,b2和b3具有更多的行。

   a1      a2     a3     b1    b2    b3
 ACTTG     10    0.345  AGGTC   2   0.198
 AGTTC      2    0.244  GGTAA   1   0.022
 AGGTC      4    0.211  CGTTA   1   0.022
 CGTTA      1    0.111 
 GCTAT      1    0.111

我需要找到匹配并组合新数据框中的a2,a3,b2,b3的a1和b1值,如下表所示。简而言之,我正在尝试删除a1和b1列之间的重复值。匹配的值可以或可以不在同一行上。

   a1        a2      a3     b2     b3
  AGGTC       4     0.211   2    0.198
  CGTTA       1     0.111   1    0.022

我正在考虑使用match(),但是我无法理解。我对r不太熟悉。我将不胜感激任何建议。预先感谢。

2 个答案:

答案 0 :(得分:2)

使用match可能会产生一些混乱,但是我建议改用merge()。

df1<-data.frame(c("A","B","C"),c(1,2,3))
df2<-data.frame(c("B","A","d"),c(5,7,9))
names(df1)<-c("id","a1")
names(df2)<-c("id","b1")

merge(df1,df2,by="id")

  id a1 b1
1  A  1  7
2  B  2  5

答案 1 :(得分:1)

您可以使用内部联接

df1 <- data.table::fread("a1      a2     a3   
                          ACTTG     10    0.345  
                          AGTTC      2    0.244  
                          AGGTC      4    0.211 
                          CGTTA      1    0.111 
                          GCTAT      1    0.111")
             
df2 <- data.table::fread("b1    b2    b3
                         AGGTC   2   0.198
                         GGTAA   1   0.022
                         CGTTA   1   0.022")

# Keep only rows that both df have in common
df1 %>% 
dplyr::inner_join(df2, 
                  by= c("a1" = "b1")) #need to specify column do join on

#      a1 a2    a3 b2    b3
# 1: AGGTC  4 0.211  2 0.198
# 2: CGTTA  1 0.111  1 0.022


# Keep all rows of `left' df
df1 %>% dplyr::left_join(df2, by= c("a1" = "b1"))

# a1 a2    a3 b2    b3
# 1: ACTTG 10 0.345 NA    NA
# 2: AGTTC  2 0.244 NA    NA
# 3: AGGTC  4 0.211  2 0.198
# 4: CGTTA  1 0.111  1 0.022
# 5: GCTAT  1 0.111 NA    NA