如何根据 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
我有一个看起来像这样的数据集:
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