Переупорядочить вектор по строкам сверху вектора - PullRequest
0 голосов
/ 01 марта 2019

Предположим, у меня есть вектор (x), значения которого находятся в таком порядке, что если бы они были в матрице nx на ny, матрица содержала бы значения, которые увеличиваются на строку, начиная с нижнего левого вверх,Любые оставшиеся незаполненные значения в матрице будут тогда NA.Позвольте мне проиллюстрировать это на примере:

nr=3
nc=3    
mx = matrix(c(7,NA,NA,4:6,1:3), nr, nc, byrow = T)
#      [,1] [,2] [,3]
# [1,]    7   NA   NA
# [2,]    4    5    6
# [3,]    1    2    3
x = c(mx)
# [1]  7  4  1 NA  5  2 NA  6  3

Теперь я хотел бы переупорядочить x в новый вектор (y) так, чтобы, если бы значения y были в матрице, NA s останется в том же месте, но другие значения будут упорядочены по возрастанию по порядку от левой top .Т.е. y должен выглядеть следующим образом

my = matrix(c(1,NA,NA,2:4,5:7), nr, nc, byrow = T)
#      [,1] [,2] [,3]
# [1,]    1   NA   NA
# [2,]    2    3    4
# [3,]    5    6    7
y = c(y)
# [1]  1  2  5 NA  3  6 NA  4  7

Я хочу найти вектор индексов, который отображает x в y.В этом случае это будет

indices = c(3, 6, 5, 4, 9, 8, 7, 2, 1)
identical(x[indices], y)
#TRUE

Но я изо всех сил пытаюсь найти простой алгоритм, который может генерировать indices для любых значений nr, nc и любого количества значений NAв x.Какие-либо предложения?NB, мы можем предположить, что никогда не будет достаточно NA s, чтобы заполнить всю строку матрицы

Ответы [ 2 ]

0 голосов
/ 01 марта 2019
my = t(replace(t(mx), which(!is.na(t(mx))), sort(mx)))
my
#     [,1] [,2] [,3]
#[1,]    1   NA   NA
#[2,]    2    3    4
#[3,]    5    6    7
match(my, mx)
#[1] 3 6 5 4 9 8 4 2 1

Или, если вектор индексов должен иметь взаимно-однозначное соответствие между двумя векторами, чтобы он не указывал на один и тот же NA дважды:

match(replace(my, is.na(my), paste0("NA", seq(sum(is.na(my))))),
      replace(mx, is.na(mx), paste0("NA", seq(sum(is.na(mx))))))
#[1] 3 6 5 4 9 8 7 2 1
0 голосов
/ 01 марта 2019

Если вы используете apply по строкам, а затем транспонируете, вы получаете исходное матричное расположение.Функция, заданная для apoply, заменяет значения не-NA на упорядоченные значения не-NA, а затем возвращает полную строку.

t( apply(mx, 1, function(x){ x[!is.na(x)] <- x[!is.na(x)][order(x[!is.na(x)])]; x}) )
     [,1] [,2] [,3]
[1,]    7   NA   NA
[2,]    4    5    6
[3,]    1    2    3

Если вы хотите, чтобы значения без матричной компоновки просто расшифровывали или переносили их в c.Если вы хотите вектор порядка, вы можете сначала установить значение ay внутри функции, равное 1: length (x), а затем назначить порядок! Is.na.

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