Здесь мы разбиваем столбцы '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)