, если ваши первые данные в dat
structure(list(V1 = c("cg00000029", "cg00000029", "cg00000029",
"cg00000029", "cg00000029", "cg00000029", "cg00000029"), V2 = c("cg01016459",
"cg02021817", "cg02851944", "cg02976952", "cg03943270", "cg07396495",
"cg12190057"), V3 = c(848L, 38L, 13L, 238L, 93L, 604L, 929L)), .Names = c("V1",
"V2", "V3"), class = "data.frame", row.names = c(NA, -7L))
, а второй набор в target
structure(list(TargetID = c("cg00000029", "cg01016459", "cg03943270"
), sample1 = c(0.157, 0.873, 0.871), sample2 = c(0.444, 0.93,
0.92), sample3 = c(0.466, 0.926, 0.926), sample4 = c(0.805, 0.942,
0.942), sample5 = c(0.5489, 0.932, 0.942), sample6 = c(0.448,
0.9128, 0.942)), .Names = c("TargetID", "sample1", "sample2",
"sample3", "sample4", "sample5", "sample6"), class = "data.frame", row.names = c(NA,
-3L))
match()
даст вам то, что вы ищете,Я бы использовал пакеты reshape и plyr.В частности, melt
и ddply
, но я уверен, что есть версия для применения.
target.melt <- melt(target,id.var='TargetID')
my.func <- function(lookup,df) {
cg.one <- lookup$value[match(df$V1,lookup$TargetID)]
cg.two <- lookup$value[match(df$V2,lookup$TargetID)]
return(list(cgone=cg.one,cgtwo=cg.two,distance=df$V3))
}
out <- dlply(target.melt,.(variable),my.func,df=dat)
есть куча NA с вашими данными, так как второй набор данных неполный, но то, что вы просилиесть:
> na.omit(as.data.frame(out[[1]]))
cgone cgtwo distance
1 0.157 0.873 848
5 0.157 0.871 93
>