1
votes

Des vecteurs d'ordre R pour que la différence entre la plupart des éléments soit positive

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


9 commentaires

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 choisiriez


J'ai posté une solution avec des permutations . Veuillez vérifier si cela aide


Pouvons-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 C


Voir stackoverflow.com/questions/11095992/… ou mon article édité pour les fonctions de base R.


3 Réponses :


1
votes

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.


0 commentaires

1
votes

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


0 commentaires

2
votes

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


2 commentaires

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