J'ai besoin d'un peu de sagesse!Collage ensemble toutes les combinaisons d'une colonne d'un data.frame avec toutes les combinaisons d'une colonne d'un autre data.frame basé sur une condition
J'ai deux trames de données, comme:
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
Maintenant, je veux coller toutes les combinaisons de chaînes de test1 (c.-à-test1 $ LET) avec toutes les combinaisons de chaînes de test2, mais seulement quand test1 différence $ num et test2 $ num est < = 100.
une façon de le faire est:
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"
cela fonctionne très bien, mais bien sûr, mon jeu de données réel est différent d'un C'est énorme, et cela prend beaucoup de temps. Je suis sûr qu'il doit y avoir un moyen plus efficace de le faire. Essayé en utilisant l'appliquer des fonctions de la famille, mais la seule façon que je pouvais penser à les utiliser est:
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"
Cela réduit déjà le temps pris par beaucoup, à près de 1/4, mais ce serait bien si elle peut être rendu plus efficace. Sans mentionner, s'il y a une manière complètement différente et meilleure de faire ceci alors ce sera fantastique.
Merci!
Peut-être 'library (data.table); setDT (test2) [, num1: = num + 100]; setDT (test1) [test2, activé =. (num <= num1), allow.cartesian = TRUE] [,,. (let, i.let)] ' – akrun
Quelle est la taille de votre jeu de données réel? –
@Moody_Mudskipper: les données proviennent de séquences de gènes, et pour un gène il y aura plus de 100 000 combinaisons de fragments de gènes collés à toute la combinaison d'un autre 100 000 fragments de gènes. – ktyagi