id带有一些符号或小写或大写时如何匹配数据

时间:2019-06-11 12:28:34

标签: r tidyverse

我想匹配两个不同的文件,但是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)

是否可以整理我的数据?谢谢

2 个答案:

答案 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