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

How can I match the values of a column according to another data frame in R and print a message using dplyr?

我有一个看起来像这样的数据集:

id1 var1
A chair
B table
C glass
D phone
E pistol

第二个包含每个 id 的许可证(但它可以包含不同的 id)

id2 var2
G mobile
H pistol
I pistol
E phone
D phone

我想检查第一个数据框中的 ID 是否已获得声明的许可。 例如,ID D 被许可拥有 phone,但 E 未被许可拥有手枪,因为它被许可拥有 phone。所以这里有三个条件,理想情况下最终数据框必须如下所示:

id1 var1 license
A chair not_needed
B table not_needed
C glass not_needed
D phone ok_checked
E pistol danger

我如何使用 dplyr 根据 R 中的逻辑条件进行交叉检查并打印这些消息?

library(tidyverse)
id1 =c("A","B","C","D","E")
var1 = c("chair","table","glass","phone","pistol")
data1 = tibble(id1,var1);data1
id2 = c("G","H","I","E","D")
var2 = c("mobile","pistol","pistol","phone","phone")
data2 = tibble(id2,var2);data2

您可以先 left_join 两个数据集,然后使用 case_when 语句将条件分配给条件。

library(tidyverse)

left_join(data1, data2, by = c("id1" = "id2")) %>% 
  mutate(var2 = case_when(is.na(var2) ~ "not_needed", 
                          var1 == var2 ~ "ok_checked", 
                          var1 != var2 ~ "danger", 
                          TRUE ~ NA_character_)) %>% 
  rename("license" = "var2")

# A tibble: 5 × 3
  id1   var1   license   
  <chr> <chr>  <chr>     
1 A     chair  not_needed
2 B     table  not_needed
3 C     glass  not_needed
4 D     phone  ok_checked
5 E     pistol danger     
library(dplyr)
data1 |> 
  full_join(data2, by=c("id1"="id2")) |> 
  rename(declared=var1, actual=var2) |> 
  mutate(license=ifelse(is.na(declared),"Not declared",
                        ifelse(declared %in% c("chair","table","glass"),"Not needed",
                               ifelse(declared==actual,"OK","Danger"))))

我用过full_join。如果不需要所有 ID,可以使用 let join。 我还假设椅子、table 和煤气不需要许可证。您可以根据需要添加或删除项目。 最后,您可以删除不需要的列。 也可以使用 case_when() 函数代替 ifelse() 语句来获得相同的结果。

  id1   declared actual license     
  <chr> <chr>    <chr>  <chr>       
1 A     chair    NA     Not needed  
2 B     table    NA     Not needed  
3 C     glass    NA     Not needed  
4 D     phone    phone  OK          
5 E     pistol   phone  Danger      
6 G     NA       mobile Not declared
7 H     NA       pistol Not declared
8 I     NA       pistol Not declared