如何使用 dplyr 根据 R 中的另一个数据框匹配列的值?

How can i match the values of a column according to another of a data frame in R using dplyr?

我有两个如下所示的数据集: 第一个是:

id gear
A1 A
A2 B
A3 C
A4 D
A5 E
A6 F
A7 G
A8 H
A9 I
A10 G

第二个:

id gear2
A1 A
A4 E
A2 A
A5 E
A13 B
A3 C
A9 I
A8 B
A7 G
A20 G
A21 B
A23 D
A33 E

有两个不平衡的数据frames.The第一个数据帧是记录的数据set.The第二个包含已知的齿轮来自id.I想检查第一个数据帧如果实际记录的内容是已知的,或者 unknown.Specifically 我想检查给定的 ID 代码,以检查每个 ID 上的两个数据 frames.But 中的齿轮是否相同。理想情况下,结果必须是:

id gear CHECK
A1 A TRUE
A2 B FALSE
A3 C TRUE
A4 D FALSE
A5 E TRUE
A6 F N/A
A7 G TRUE
A8 H FALSE
A9 I TRUE
A10 G N/A
id1 = c("A1","A2","A3","A4","A5","A6","A7","A8","A9","A10")
Gear1 = c("A","B","C","D","E","F","G","H","I","G")
dat1 = tibble(id1,Gear1);dat1

id2 = c("A1","A4","A2","A5","A13","A3","A9","A8","A7","A20","A21","A23","A33")
Gear2 = c("A","E","A","E","B","C","I","B","G","G","B","D","E")
dat2 = tibble(id2,Gear2);dat2

我如何使用 dplyr 包在 R 中完成它? 有帮助吗?

您可以使用 left_join 然后比较两列:

library(dplyr)

dat1 %>% 
  left_join(dat2, by = c("id1" = "id2")) %>% 
  mutate(CHECK = Gear1 == Gear2) %>% 
  select(id = id1, gear = Gear1, CHECK)

# A tibble: 10 × 3
   id    gear  CHECK
   <chr> <chr> <lgl>
 1 A1    A     TRUE 
 2 A2    B     FALSE
 3 A3    C     TRUE 
 4 A4    D     FALSE
 5 A5    E     TRUE 
 6 A6    F     NA   
 7 A7    G     TRUE 
 8 A8    H     FALSE
 9 A9    I     TRUE 
10 A10   G     NA   

查看dplyr documentation如何使用联接。

编辑

感谢 Ritchie Sacramento 直接在 select 函数中进行重命名的技巧。

试试这个:

dat1 |> 
  mutate(check = ifelse(!id1 %in% dat2$id2, 
                        NA,
                        ifelse(paste(id1, Gear1) %in% paste(dat2$id2, dat2$Gear2), 
                               TRUE, 
                               FALSE)))
library(tidyverse)

dat1 = rename(dat1, id = 'id1')
dat2 = rename(dat2, id = 'id2')

check_data = dat1 %>% 
  full_join(dat2, by='id') %>% 
  mutate(check = ifelse(Gear1==Gear2, TRUE, FALSE)) %>% 
  filter(! is.na(Gear1))

输出:

check_data
# A tibble: 10 x 4
   id    Gear1 Gear2 check
   <chr> <chr> <chr> <lgl>
 1 A1    A     A     TRUE 
 2 A2    B     A     FALSE
 3 A3    C     C     TRUE 
 4 A4    D     E     FALSE
 5 A5    E     E     TRUE 
 6 A6    F     NA    NA   
 7 A7    G     G     TRUE 
 8 A8    H     B     FALSE
 9 A9    I     I     TRUE 
10 A10   G     NA    NA