我正在尝试处理一些非常混乱的数据.我需要通过样本ID合并两个包含不同类型数据的大数据帧.问题是一个表的样本ID有许多不同的格式,但大多数都包含所需的ID字符串,用于匹配其ID中的某个位置,例如一个表中的样本“1234”在另一个表中具有“ProjectB(1234)”的ID.
我做了一个简单的可重复的例子.
a<-data.frame(aID=c("1234","4567","6789","3645"),aInfo=c("blue","green","goldenrod","cerulean")) b<-data.frame(bID=c("4567","(1234)","23645","63528973"),bInfo=c("apple","banana","kiwi","pomegranate","lychee"))
使用merge可以获得部分方法:
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来完成它,所以你最终必须用by编写一个自定义函数.这是非常低效的,但是,合并也是如此.如果您有数百万行,请考虑data.table.这就是你如何进行“内连接”,只返回匹配的行.
# I slightly modified your data to test multiple matches a<-data.frame(aID=c("1234","1234","blue2","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,f,b)) left.over<-!(b$bID %in% d$bID) rbind(d,do.call(rbind,by(b[left.over,'bID',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