Рандоминг равных значений по порядку в R - PullRequest
0 голосов
/ 06 мая 2018

Я должен получить порядок одного вектора, чтобы отсортировать другой вектор. Дело в том, что я не хочу, чтобы моя функция была стабильной. На самом деле, я бы хотел случайный порядок равных значений. Есть идеи, как сделать это в R за конечное время? : D

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы можете сделать это в базе R, используя order. порядок будет принимать несколько переменных для сортировки. Если вы сделаете вторую случайную переменную, она будет рандомизировать связи. Вот пример использования встроенных данных радужной оболочки. Переменная Sepal.Length имеет несколько связей для второго наименьшего значения. Вот некоторые из них:

iris$Sepal.Length[c(9,39,43)]
[1] 4.4 4.4 4.4

Теперь давайте сортируем только эту переменную (стабильная сортировка), а затем сортируем случайную вторичную сортировку.

order(iris$Sepal.Length)
  [1]  14   9  39  43  42   4   7  23  48   3  30  12  13  25  31  46   2  10  35
 [20]  38  58 107   5   8  26  27  36  41  44  50  61  94   1  18  20  22  24  40
 [39]  45  47  99  28  29  33  60  49   6  11  17  21  32  85  34  37  54  81  82
 [58]  90  91  65  67  70  89  95 122  16  19  56  80  96  97 100 114  15  68  83
 [77]  93 102 115 143  62  71 150  63  79  84  86 120 139  64  72  74  92 128 135
 [96]  69  98 127 149  57  73  88 101 104 124 134 137 147  52  75 112 116 129 133
[115] 138  55 105 111 117 148  59  76  66  78  87 109 125 141 145 146  77 113 144
[134]  53 121 140 142  51 103 110 126 130 108 131 106 118 119 123 136 132

order(iris$Sepal.Length, sample(150,150))
  [1]  14  43  39   9  42  48   7   4  23   3  30  25  31  46  13  12  35  38 107
 [20]  10  58   2   8  41  27  61  94   5  36  44  50  26  18  22  99  40  20  47
 [39]  24  45   1  33  60  29  28  49  85  11   6  32  21  17  90  81  91  54  34
 [58]  37  82  67 122  95  65  70  89 100  96  56 114  80  16  19  97  93  15  68
 [77] 143 102  83 115 150  62  71 120  79  84  63 139  86  72 135  74  64  92 128
 [96] 149  69  98 127  88 134 101  57 137  73 104 147 124 138 112 129 116  75  52
[115] 133 148  55 111 105 117  59  76  87  66  78 146 141 109 125 145 144 113  77
[134] 140  53 121 142  51 103 126 130 110 108 131 106 136 119 118 123 132

Без случайной вторичной сортировки позиции 2,3 и 4 находятся в порядке (стабильно). Со случайной вторичной сортировкой они перемешаны.

0 голосов
/ 06 мая 2018

Попробуйте fct_reorder в пакете forcats, чтобы упорядочить один фактор за другим. Если вы также хотите ввести случайность, попробуйте fct_reorder2 с .y = runif(length(your_vector))

(Я, очевидно, думаю в странных направлениях сегодня - fct_reorder переупорядочит уровни фактора. Если это то, что вам нужно, это может помочь. В противном случае, order - лучший подход.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...