J'ai deux vecteurs
B = c(20213,21865,26217,30558,31674)
A = c(30709,28587,21672,20873,19877)
Le vecteur B est toujours trié par ordre croissant
J'ai besoin de mélanger le vecteur A dans un tel façon que lors de la prise de la différence (AB), la plupart d'entre eux devraient donner le résultat + ve.
Ici, la sortie A doit ressembler à (20873,28587,30709,19877,21672) car cet ordre me donnera 3 différences (AB) qui seront + ve
3 Réponses :
Cette solution peut être coûteuse en calcul si vos vecteurs A et B comportent de nombreux éléments, mais dans ce cas, elle est instantanée.
V1 V2 V3 V4 V5 num_positives 28 20873 19877 28587 30709 21672 3 34 20873 21672 28587 30709 19877 3 38 20873 28587 19877 30709 21672 3 40 20873 28587 21672 30709 19877 3 41 20873 28587 30709 19877 21672 3 ...
Sortie
# create a dataframe of all possible permutations of A perms <- as.data.frame(gtools::permutations(length(A), length(A), A)) # add a column that will signal how many positive differences A-B there will be perms$num_positives <- 0 # for each row in the dataframe, calculate how many positive differences A-B there are for (i in 1:nrow(perms)) perms$num_positives[i] <- sum(perms[i,] > B) # order the dataframe according to the descending number of positive differences perms[order(perms$num_positives, decreasing = TRUE), ]
num_positives
est le nombre de différences positives entre A et B.
Dans votre cas, il existe de nombreuses permutations de A qui obtiennent un nombre de différences positives AB égal à 3, comme indiqué dans la sortie.
Nous pouvons utiliser des permutations
à partir de arrangements
pour créer toute la permutation, puis la soustraire avec 'B', obtenir les rowSums
de la différence supérieur à 0, et sous-ensemble le 'm1' où le nombre est max
, Dans ce cas, le max
est 3 et ce sont les combinaisons qui créeraient ce max
différence de valeurs positives
library(arrangements) m1 <- permutations(A, length(A)) c1 <- rowSums(m1- B[col(m1)] > 0) m1[c1 == max(c1),] # [,1] [,2] [,3] [,4] [,5] # [1,] 21672 30709 28587 20873 19877 # [2,] 21672 30709 28587 19877 20873 # [3,] 21672 28587 30709 20873 19877 # [4,] 21672 28587 30709 19877 20873 # [5,] 21672 28587 20873 30709 19877 # [6,] 21672 28587 19877 30709 20873 # [7,] 21672 20873 28587 30709 19877 # [8,] 21672 19877 28587 30709 20873 # [9,] 20873 30709 28587 21672 19877 #[10,] 20873 30709 28587 19877 21672 #[11,] 20873 28587 30709 21672 19877 #[12,] 20873 28587 30709 19877 21672 #### #[13,] 20873 28587 21672 30709 19877 #[14,] 20873 28587 19877 30709 21672 #[15,] 20873 21672 28587 30709 19877 #[16,] 20873 19877 28587 30709 21672
Autant d'options pour les permutations ... en voici une qui utilise le package Rfast
:
A = c(30709,28587,21672,20873,19877) B = c(20213,21865,26217,30558,31674) permutation <- function(x) { if (length(x) == 1) { return(x) } else { res <- matrix(nrow = 0, ncol = length(x)) for (i in seq_along(x)) { res <- rbind(res, cbind(x[i], Recall(x[-i]))) } return(res) } } pa <- permutation(A) pA <- sapply(seq_len(dim(pa)[1]), function(x) pa[x,] - B) pa[colSums(sign(pA)) == max(colSums(sign(pA))), ] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 21672 30709 28587 20873 19877 #> [2,] 21672 30709 28587 19877 20873 #> [3,] 21672 28587 30709 20873 19877 #> [4,] 21672 28587 30709 19877 20873 #> [5,] 21672 28587 20873 30709 19877 #> [6,] 21672 28587 19877 30709 20873 #> [7,] 21672 20873 28587 30709 19877 #> [8,] 21672 19877 28587 30709 20873 #> [9,] 20873 30709 28587 21672 19877 #> [10,] 20873 30709 28587 19877 21672 #> [11,] 20873 28587 30709 21672 19877 #> [12,] 20873 28587 30709 19877 21672 #> [13,] 20873 28587 21672 30709 19877 #> [14,] 20873 28587 19877 30709 21672 #> [15,] 20873 21672 28587 30709 19877 #> [16,] 20873 19877 28587 30709 21672
Modifier: version de base R:
library(Rfast) #> Loading required package: Rcpp #> Loading required package: RcppZiggurat A = c(30709,28587,21672,20873,19877) B = c(20213,21865,26217,30558,31674) pa <- permutation(A) pA <- sapply(seq_len(dim(pa)[1]), function(x) pa[x,] - B) pa[colSums(sign(pA)) == max(colSums(sign(pA))), ] #> [,1] [,2] [,3] [,4] [,5] #> [1,] 20873 19877 28587 30709 21672 #> [2,] 20873 21672 28587 30709 19877 #> [3,] 20873 28587 19877 30709 21672 #> [4,] 20873 28587 21672 30709 19877 #> [5,] 20873 28587 30709 19877 21672 #> [6,] 20873 28587 30709 21672 19877 #> [7,] 20873 30709 28587 19877 21672 #> [8,] 20873 30709 28587 21672 19877 #> [9,] 21672 19877 28587 30709 20873 #> [10,] 21672 20873 28587 30709 19877 #> [11,] 21672 28587 19877 30709 20873 #> [12,] 21672 28587 20873 30709 19877 #> [13,] 21672 28587 30709 19877 20873 #> [14,] 21672 28587 30709 20873 19877 #> [15,] 21672 30709 28587 19877 20873 #> [16,] 21672 30709 28587 20873 19877
Créé le 04/04/2020 par le package reprex (v0.3.0)
Référence: Génération de toutes les permutations distinctes d'une liste dans R
Existe-t-il un moyen de l'implémenter sans aucun package?
@Gaurav Chavan: voir stackoverflow.com/questions/11095992/... pour les fonctions de base R
as-tu un seuil
Je n'ai pas obtenu votre seuil comme si?
mais la différence dépend aussi de l'ordre de 'B'
Ici, B est toujours trié par ordre croissant
il pourrait y avoir plus d'une combinaison qui peut résulter dans ce cas
c (20873, 19877, 28587, 30709, 21679) - B
donne également 3 positifs. Donc, il n'est pas clair lequel vous choisiriezJ'ai posté une solution avec des
permutations
. Veuillez vérifier si cela aidePouvons-nous le faire sans utiliser de package externe?
Cela peut être fait mais les
arrangements
sont assez rapides et si nous le faisons avec la base, ce ne serait pas aussi efficace. la fonction est écrite en CVoir stackoverflow.com/questions/11095992/… ou mon article édité pour les fonctions de base R.