gpt4 book ai didi

r - 当数字不完全匹配时匹配 2 个数据框中的列

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:06 25 4
gpt4 key购买 nike

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

我正在考虑使用 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/...?

最佳答案

可以写一个函数,从包含“/”或“-”的字符串中提取出相应的序列,重新组合成一个新的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)
}

然后你可以合并 df2 和 df1:

merge(doIt(df1), df2, by = "ID", all.x = T)

希望这对您有所帮助!

关于r - 当数字不完全匹配时匹配 2 个数据框中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com