gpt4 book ai didi

R 合并数据帧,允许不精确的 ID 匹配(例如,附加字符 1234 匹配 ab1234)

转载 作者:行者123 更新时间:2023-12-04 08:25:51 30 4
gpt4 key购买 nike

我正在尝试处理一些非常困惑的数据。我需要通过样本 ID 合并两个包含不同类型数据的大数据框。问题是一张表的样本 ID 有许多不同的格式,但大多数都包含用于匹配其 ID 中某处所需的 ID 字符串,例如一个表中的样本“1234”在另一个表中的 ID 为“ProjectB(1234)”。

我做了一个最小的可重复示例。

a<-data.frame(aID=c("1234","4567","6789","3645"),aInfo=c("blue","green","goldenrod","cerulean"))
b<-data.frame(bID=c("4567","(1234)","6789","23645","63528973"), bInfo=c("apple","banana","kiwi","pomegranate","lychee"))

使用合并获得部分方式:
merge(a,b, by.x="aID", by.y="bID", all=TRUE)

aID aInfo bInfo
1 1234 blue <NA>
2 3645 cerulean <NA>
3 4567 green apple
4 6789 goldenrod kiwi
5 (1234) <NA> banana
6 23645 <NA> pomegranate
7 63528973 <NA> lychee

但想要的输出基本上是:
        ID     aInfo       bInfo
1 1234 blue banana
2 3645 cerulean pomegranate
3 4567 green apple
4 6789 goldenrod kiwi
5 63528973 <NA> lychee

我只是想知道是否有办法将 grep 合并到这个或另一个 R-tastic 方法中?

提前致谢

最佳答案

在条件下执行 merge 有点棘手。我不认为你可以用 merge 写它,所以你最终不得不用 by 编写一个自定义函数。它的效率非常低,但是 merge 也是如此。如果您有数百万行,请考虑 data.table 。这就是执行“内部联接”的方式,其中仅返回匹配的行。

# I slightly modified your data to test multiple matches    
a<-data.frame(aID=c("1234","1234","4567","6789","3645"),aInfo=c("blue","blue2","green","goldenrod","cerulean"))
b<-data.frame(bID=c("4567","(1234)","6789","23645","63528973"), bInfo=c("apple","banana","kiwi","pomegranate","lychee"))

f<-function(x) merge(x,b[agrep(x$aID[1],b$bID),],all=TRUE)
do.call(rbind,by(a,a$aID,f))

# aID aInfo bID bInfo
# 1234.1 1234 blue (1234) banana
# 1234.2 1234 blue2 (1234) banana
# 3645 3645 cerulean 23645 pomegranate
# 4567 4567 green 4567 apple
# 6789 6789 goldenrod 6789 kiwi

进行完全连接有点棘手。这是一种方法,仍然效率低下:
f<-function(x,b) {
matches<-b[agrep(x[1,1],b[,1]),]
if (nrow(matches)>0) merge(x,matches,all=TRUE)
# Ugly... but how else to create a data.frame full of NAs?
else merge(x,b[NA,][1,],all.x=TRUE)
}
d<-do.call(rbind,by(a,a$aID,f,b))
left.over<-!(b$bID %in% d$bID)
rbind(d,do.call(rbind,by(b[left.over,],'bID',f,a))[names(d)])

# aID aInfo bID bInfo
# 1234.1 1234 blue (1234) banana
# 1234.2 1234 blue2 (1234) banana
# 3645 3645 cerulean 23645 pomegranate
# 4567 4567 green 4567 apple
# 6789 6789 goldenrod 6789 kiwi
# bID <NA> <NA> 63528973 lychee

关于R 合并数据帧,允许不精确的 ID 匹配(例如,附加字符 1234 匹配 ab1234),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165256/

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