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)