如何使用 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
我有两个如下所示的数据集: 第一个是:
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