Проверьте, находятся ли значения в матрице, затем заполните матрицу шаблона. - PullRequest
1 голос
/ 24 февраля 2020

Я не знаю другого хорошего способа express заголовка.

У меня есть одна горячая кодировка данной матрицы. Пример: здесь

> set.seed(4)
> t <- matrix(floor(runif(10, 1,9)),5,5)

      [,1] [,2] [,3] [,4] [,5]
[1,]    5    3    5    3    5
[2,]    1    6    1    6    1
[3,]    3    8    3    8    3
[4,]    3    8    3    8    3
[5,]    7    1    7    1    7
> class(t)
[1] "matrix"

      1_1 1_3 1_5 1_7 2_1 2_3 2_6 2_8 3_1 3_3 3_5 3_7 4_1 4_3 4_6 4_8 5_1 5_3 5_5 5_7
[1,]   0   0   1   0   0   1   0   0   0   0   1   0   0   1   0   0   0   0   1   0
[2,]   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0   0
[3,]   0   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0
[4,]   0   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0
[5,]   0   0   0   1   1   0   0   0   0   0   0   1   1   0   0   0   0   0   0   1

Я изо всех сил пытался преобразовать другую матрицу, например, как показано ниже, для преобразования в ожидаемую форму.

     [,1] [,2] [,3] [,4] [,5]
[1,]    7    4    8    1    3
[2,]    3    7    4    8    1
[3,]    1    3    7    4    8
[4,]    8    1    3    7    4

Ожидается следующее, где столбец остается в качестве предыдущей кодированной матрицы, но столбцы должны быть заполнены 0s и 1s в соответствии с полями в новой заданной матрице.

      1_1 1_3 1_5  1_7 2_1 2_3 2_6 2_8 3_1 3_3 3_5 3_7 4_1 4_3 4_6 4_8 5_1 5_3 5_5 5_7
[1,]   0   0   0    1   0   0   0   0   0   0   0   0   1   0   0   0   0   1   0   0
[2,]   0   1   0    0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0 
[3,]   1   0   0    0   0   1   0   0   0   0   0   1   0   0   0   0   0   0   0   0
[4,]   0   0   0    0   1   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0

Поскольку имена столбцов отличаются от значений в новой заданной матрице, я не знаю, как проверить новые заданные значения столбца для старых значений столбца.

Любое предложение или подсказка поможет большому время. Я боролся с этим все выходные.

1 Ответ

1 голос
/ 24 февраля 2020

Здесь мы разбиваем столбцы 't' и 'oldt' на asplit, указывая MARGIN как 2, затем используем Map, чтобы передать соответствующие list элементы набора данных для разделения вместе с последовательностью столбцы (seq_len(ncol(t))). Внутри Map создайте анонимный вызов функции (function(x, y, z) - x, y, z, представляющий значения столбцов 't', 'oldt' и индекс столбца), создайте вектор sort ed unique из значение столбца 'oldt' ('y1'), matrix из 0 для хранения выходных данных ('m1'), затем sort значения, общие для столбцов 't' и 'oldt' ('v1) '), получите позицию строки этого значения в столбце' t '(' i1 '), а также позицию столбца, указав match имена столбцов с последовательностью paste ed (' z ') и' v1 ', используя индекс строки / столбца, replace эти позиции в матрице (' m1 ') с 1.

do.call(cbind, Map(function(x, y, z) {
    y1 <- sort(unique(y))
    m1 <- matrix(0, length(x), length(y1), dimnames = list(NULL, paste(z, y1, sep="_")))
    v1 <- sort(intersect(x, y))
    i1 <- match(v1, x)
    j1 <- match(paste(z, v1, sep="_"), colnames(m1))
    replace(m1, cbind(i1, j1), 1) }, asplit(t, 2), asplit(oldt, 2), seq_len(ncol(t))))
#     1_1 1_3 1_5 1_7 2_1 2_3 2_6 2_8 3_1 3_3 3_5 3_7 4_1 4_3 4_6 4_8 5_1 5_3 5_5 5_7
#[1,]   0   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   1   0   0
#[2,]   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0
#[3,]   1   0   0   0   0   1   0   0   0   0   0   1   0   0   0   0   0   0   0   0
#[4,]   0   0   0   0   1   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0

data

oldt <- structure(c(5, 1, 3, 3, 7, 3, 6, 8, 8, 1, 5, 1, 3, 3, 7, 3, 6, 
8, 8, 1, 5, 1, 3, 3, 7), .Dim = c(5L, 5L))

t <- structure(c(7, 3, 1, 8, 4, 7, 3, 1, 8, 4, 7, 3, 1, 8, 4, 7, 3, 
1, 8, 4), .Dim = 4:5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...