R 当数字不';不完全匹配

R 当数字不';不完全匹配,r,database,R,Database,当比较的值不完全相同时,如何匹配两个不同的数据帧 我想使用merge(),但我不确定 表1: ID Value.1 10001 x 18273-9 y 12824/5/6/7 z 10283/5/9 d 表2: ID Value.2 10001 a 18274 b 12826 c 10289 u 如何根据ID合并表1和表2 我会使用fuzzyjoin包的哪个特定功能

当比较的值不完全相同时,如何匹配两个不同的数据帧

我想使用
merge()
,但我不确定

表1:

ID           Value.1
10001        x
18273-9      y
12824/5/6/7  z
10283/5/9    d
表2:

ID           Value.2
10001        a
18274        b
12826        c
10289        u
如何根据ID合并表1和表2


我会使用fuzzyjoin包的哪个特定功能,尤其是“/”和“-”案例?如何从18273-9扩展“-”大小写,以便R将注册18273/18274/18275/…?

您可以使用基于R的模糊字符串匹配函数“agrep”

df1 <- data.frame(ID=c("10001","18273-9","12824/5/6/7","10283/5/9"), 
                  value=c("a","c","d","k"))

df2 <- data.frame(ID=c("10001","18274","12826","10289"), 
                  value=c("o","p","q","r"))

apply(df1, 1, function(x) agrep(x["ID"], df2$ID, max = 3.5))


df1一个选项可能包括提取要保留的ID格式。然后进行合并

您可以按如下方式设置ID列的格式:

library(stringr) 
library(dplyr) 
如果只需要符号前的数字

Table1 %>% mutate(ID = str_extract("[0-9]*")) 
如果要保留5位数字的第一个序列

Table1 %>% mutate(ID = str_extract("[0-9]{5}"))

这回答了您的第二个问题,但没有使用
fuzzyjoin
包您可以编写一个函数,从包含“/”或“-”的字符串中提取相应的序列,并将它们重新组合到一个新的data.frame中,如下所示:

df1 <- data.frame(ID=c("10001","18273-9","15273-8", "15170-4",  "12824/5/6/7","10283/5/9"), 
                  value=c("a","c","c", "d","k", "l"), stringsAsFactors = F)

df2 <- data.frame(ID=c("10001","18274","12826","10289"), 
                  value=c("o","p","q","r"), stringsAsFactors = F)

doIt <- function(df){
  listAsDF <- function(l) {
    x <- stack(setNames(l, temp$value))
    names(x) <- c("ID", "value")
    return(x)
  }
  Base <- df[!grepl("\\/", df$ID) & !grepl("\\-", df$ID), ]
  #1 cases when - present
  temp <- df[grep("\\-", df$ID),]
  temp <- listAsDF(lapply(strsplit(temp$ID, "-"), function(e) seq(e[1], paste0(strtrim(e[1], nchar(e[1])-1), e[2]), 1)))
  Base <- rbind(Base, temp)
  #2 cases when / present
  temp <- df[grep("\\/", df$ID),]
  temp <- listAsDF(lapply(strsplit(temp$ID, "/"), function(a) c(a[1], paste0(strtrim(a[1], nchar(a[1])-1), a[-1]))))
  Base <- rbind(Base, temp)
  return(Base)
}

希望这有帮助

查看该软件包。您正在查找的连接类型(内部、左侧、完整)可能重复?你期望的结果是什么?这真的很有帮助!我可以知道你为什么用x和temp的集合名吗?谢谢大家!
setNames
为对象命名并返回对象本身,这就是我想要的,因为我需要在堆栈函数中进一步使用这些名称。您是否介意解释
strtrim
中的参数?我在谷歌上搜索了一下,这里应该只有两个-
strtrim(x,宽度)
?非常感谢你!!很抱歉打扰您,我才刚开始。
strtrim
正在将字符串修剪到所需的宽度,就像您所说的需要两个参数,如果您将代码拆分,您会看到,这正是正在发生的事情
x
e[1]
/
a[1]
宽度是
nchar(e[1])-1
/
nchar(a[1])-1
merge(doIt(df1), df2, by = "ID", all.x = T)