Векторы R-порядка, так что разница между большинством элементов положительна - PullRequest
1 голос
/ 04 апреля 2020

У меня есть два вектора

A = c(30709,28587,21672,20873,19877)
B = c(20213,21865,26217,30558,31674)

Вектор B всегда сортируется в порядке возрастания

Мне нужно перетасовать вектор A таким образом, чтобы при разнице (AB) большинство из них должно дать результат + ve.

Здесь вывод A должен выглядеть следующим образом (20873,28587,30709,19877,21672), потому что этот порядок даст мне 3 различия (AB), которые будут + в

Ответы [ 3 ]

2 голосов
/ 04 апреля 2020

Так много вариантов для перестановок ... вот один, использующий пакет Rfast:

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

Редактировать: базовая версия R:

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

Создано в 2020-04-04 пакетом Представ (v0.3.0)

Ссылка: Генерация всех различных перестановок списка в R

1 голос
/ 04 апреля 2020

Мы можем использовать permutations из arrangements, чтобы создать всю перестановку, затем вычесть ее с помощью 'B', получить rowSums разности больше 0 и подмножество 'm1', где количество равно max, в этом случае max равно 3, и это комбинации, которые создали бы эту max разницу положительных значений

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
1 голос
/ 04 апреля 2020

Это решение может быть вычислительно дорогим, если ваши векторы A и B имеют много элементов, но в этом случае оно происходит мгновенно.

# 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), ]

Выход

       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
...

num_positives - это число положительных различий между A и B.

В вашем случае есть много перестановок A, которые получают число положительных разностей AB, равное 3, как показано в выходных данных.

...