Найти значения ячеек в матрице, используя значения из другого кадра данных - PullRequest
3 голосов
/ 22 сентября 2019

У меня есть матрица со всеми значениями ячеек от -1: 1 и другой фрейм данных, который определяет ячейки строк / столбцов для каждой ячейки, которую мне нужно найти.

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

МАТРИЦА ЕСТЬ:

      1   2   3   4   5   6   7   8   9  10

 1    0   0   0   1   0   1   1   0   0   0
 2    0   0  -1  -1   1   1  -1  -1   0   0
 3    0   0  -1   0   0  -1   0  -1   0   0
 4   -1   1   0   0   1   1   0  -1   1  -1
 5   -1   1   0  -1  -1   0   0   0   0   1
 6    1  -1   1   1   0   0  -1  -1   0   1
 7    0  -1   1   0   1   1   0   1  -1   0
 8    0   0  -1  -1  -1   0   1  -1   0   1
 9   -1   1   0   1   1  -1   0   1  -1  -1
10   -1   1  -1  -1  -1  -1   1   0   1  -1

ИМЕТЬ ДАННЫЕ:

     i   j   k

 1   3   4   2
 2   4   8  10
 3  10   7   5
 4   2   6   8
 5   9  10   7
 6   2  10   4
 7   7   8  10
 8   6  10   8
 9   2   9   5
10   9   7   1

ХОЧУ ДАННЫХ:

     i    j    k    j,i    k,i    k,j

 1   3    4    2      0     -1     -1
 2   4    8   10     -1     -1      0 
 3  10    7    5      0      1      0
 4   2    6    8     -1      0      0
 5   9   10    7      1     -1      0   
 6   2   10    4      1      1     -1
 7   7    8   10      1      1      0
 8   6   10    8     -1      0      1
 9   2    9    5      1      1      0
10   9    7    1     -1      0      1

1 Ответ

1 голос
/ 22 сентября 2019

Одним из вариантов будет использование combn или sapply (если комбинация должна быть в определенном порядке, выполните цикл по list, извлеките столбцы второго набора данных, используйте его в качестве индекса строки / столбцаизвлечение соответствующих элементов из первого набора данных и cbind

indList <- list(ji = c('j', 'i'), ki = c('k', 'i'), kj = c('k', 'j'))
cbind(df2, sapply(indList, function(x) m1[as.matrix(df2[x])]))
#    i  j  k ji ki kj
#1   3  4  2  0 -1 -1
#2   4  8 10 -1 -1  0
#3  10  7  5  0  1  0
#4   2  6  8 -1  0  0
#5   9 10  7  1 -1  0
#6   2 10  4  1  1 -1
#7   7  8 10  1  1  0
#8   6 10  8 -1  0  1
#9   2  9  5  1  1  0
#10  9  7  1 -1  0  1

Это также возможно с combn)

cbind(df2, combn(df2, 2, FUN = function(x) m1[as.matrix(x[2:1])]))

data

df2 <- structure(list(i = c(3L, 4L, 10L, 2L, 9L, 2L, 7L, 6L, 2L, 9L), 
    j = c(4L, 8L, 7L, 6L, 10L, 10L, 8L, 10L, 9L, 7L), k = c(2L, 
    10L, 5L, 8L, 7L, 4L, 10L, 8L, 5L, 1L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

m1 <- structure(c(0L, 0L, 0L, -1L, -1L, 1L, 0L, 0L, -1L, -1L, 0L, 0L, 
0L, 1L, 1L, -1L, -1L, 0L, 1L, 1L, 0L, -1L, -1L, 0L, 0L, 1L, 1L, 
-1L, 0L, -1L, 1L, -1L, 0L, 0L, -1L, 1L, 0L, -1L, 1L, -1L, 0L, 
1L, 0L, 1L, -1L, 0L, 1L, -1L, 1L, -1L, 1L, 1L, -1L, 1L, 0L, 0L, 
1L, 0L, -1L, -1L, 1L, -1L, 0L, 0L, 0L, -1L, 0L, 1L, 0L, 1L, 0L, 
-1L, -1L, -1L, 0L, -1L, 1L, -1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 
0L, -1L, 0L, -1L, 1L, 0L, 0L, 0L, -1L, 1L, 1L, 0L, 1L, -1L, -1L
), .Dim = c(10L, 10L), .Dimnames = list(c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10"), c("1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...