Ich brauche etwas Weisheit!Zusammenfügen aller Kombinationen einer Spalte aus einem data.frame mit allen Kombinationen einer Spalte eines anderen data.frames basierend auf einer Bedingung
Ich habe zwei Datenrahmen, wie:
test1 <- data.frame(let = replicate(100, paste(sample(LETTERS[1:12] , 3) , collapse ="") ) , num = sample(1:500 , 100 , replace = FALSE))
test2 <- data.frame(let = replicate(100, paste(sample(LETTERS[13:26] , 4) , collapse ="") ) , num = sample(1:500 , 100 , replace = FALSE))
head(test1)
# let num
# 1 KDA 430
# 2 IHB 41
# 3 GAB 473
# 4 HKJ 335
# 5 LCK 261
# 6 EIK 500
head(test2)
# let num
# 1 ZUYW 153
# 2 PRNW 263
# 3 OTQS 355
# 4 NYRW 87
# 5 ZYST 365
# 6 TXRN 287
Nun, ich alle Kombinationen von Zeichenketten aus test1 (dh test1 $ lassen) mit allen Kombinationen von Strings von test2 einfügen möchten, aber nur, wenn die Differenz test1 $ num und test2 $ num ist < = 100.
eine Möglichkeit, dies zu tun ist:
test.merg <- NULL
i <- 1; j <- 1
for(i in 1:dim(test1)[1]) {
for(j in 1:dim(test2)[1] ) {
if(abs(test1[i,]$num - test2[j,]$num) <= 100 ){
test.merg <- c(test.merg ,paste(test1[i,]$let , test2[j,]$let , sep="." ))
}
j <- j+ 1
}
i <- i+ 1
}
head(test.merg)
#[1] "KDA.OTQS" "KDA.ZYST" "KDA.TVRX" "KDA.VYRQ" "KDA.XRQS" "KDA.WSUR"
Dies funktioniert gut, aber natürlich meine tatsächliche Datenmenge unterscheidet sich ein Und es dauert sehr lange, dies zu tun. Ich bin mir sicher, dass es einen effizienteren Weg dafür geben muss. Versuchte die Familie Funktionen anwenden verwenden, aber der einzige Weg, ich denken konnte, sie zu verwenden ist:
test1.1 <- paste(test1$let , test1$num ,sep = "_")
test2.1 <- paste(test2$let , test2$num ,sep = "_")
test.merg.1 <- unlist(lapply(test1.1 , FUN = function(x) {lapply(
test2.1 , FUN = function(y) {
if(abs(as.numeric(str_split_fixed(x , "_" , 2)[,2]) - as.numeric(str_split_fixed(y , "_" , 2)[,2])) <= 100){
paste(str_split_fixed(x , "_" , 2)[,1] , str_split_fixed(y , "_" , 2)[,1], sep = ".")
}
})
})
)
head(test.merg.1)
# [1] "KDA.OTQS" "KDA.ZYST" "KDA.TVRX" "KDA.VYRQ" "KDA.XRQS" "KDA.WSUR"
Dies schon die Zeit, die ziemlich viel, fast 1/4., Aber es wäre schön, wenn es genommen reduziert kann effizienter gemacht werden. Ganz zu schweigen davon, wenn es einen komplett anderen und besseren Weg gibt, dann wird es fantastisch.
Vielen Dank!
Vielleicht 'library (data.table); setDT (test2) [, num1: = num + 100]; setDT (test1) [test2, ein =. (num <= num1), allow.cartesian = TRUE] [,,. (let, i.let)] ' – akrun
Wie groß ist Ihr tatsächlicher Datensatz? –
@Moody_Mudskipper: Daten stammen aus Gensequenzen, und für ein Gen werden mehr als 100.000 Kombinationen von Genfragmenten in alle Kombinationen von weiteren 100.000 Genfragmenten eingefügt. – ktyagi