我想匹配两个不同的文件,但是ID有一些符号或小写/大写。 这是我的数据:
df1<-read.table(text="id v1 v2 v3
xxx, 12 11 13
MMM w n m
GgG Q n m
bccde, w P m
QMC NA T p
",h=T)
第二个文件是:
df2<-read.table(text="id M4 N4
mmm 10 23
BcCde 11 11
GGG, 12 5
XXX 21 6
",h=T)
我想得到:
df3<-read.table(text="id v1 v2 v3 M4 N4
xxx, 12 11 13 21 6
MMM w n m 10 23
GgG Q n m 12 5
bccde, w P m 11 11
QMC NA T p NA NA
",h=T)
我使用合并,但不起作用
merge(x = df1, y = df2, by = "id", all = TRUE)
是否可以整理我的数据?谢谢
答案 0 :(得分:0)
您可以将所有ids
转换为小写,然后合并。使用dplyr
,
library(tidyverse)
df1 %>%
mutate(id = tolower(id)) %>%
left_join(df2 %>% mutate(id = tolower(id)), by = 'id')
给出,
id v1 v2 v3 M4 N4 1 xxx, 12 11 13 NA NA 2 mmm w n m 10 23 3 ggg Q n m NA NA 4 bccde, w P m NA NA 5 qmc <NA> T p NA NA
答案 1 :(得分:0)
我们可以使用regex_left_join
中的fuzzyjoin
library(fuzzyjoin)
library(dplyr)
library(stringr)
regex_left_join(df1, mutate(df2, id = str_remove(id, ",")),
by = "id", ignore_case = TRUE) %>%
select(id = id.x, v1, v2, v3, M4, N4)
# id v1 v2 v3 M4 N4
#1 xxx, 12 11 13 21 6
#2 MMM w n m 10 23
#3 GgG Q n m 12 5
#4 bccde, w P m 11 11
#5 QMC <NA> T p NA NA
或使用select
everything()
regex_left_join(df1, mutate(df2, id = str_remove(id, ",")),
by = "id", ignore_case = TRUE) %>%
select(everything(), id = id.x, -id.y)
# id v1 v2 v3 M4 N4
#1 xxx, 12 11 13 21 6
#2 MMM w n m 10 23
#3 GgG Q n m 12 5
#4 bccde, w P m 11 11
#5 QMC <NA> T p NA NA