Как сравнить, если значения фрейма данных A содержат одно из значений фрейма данных B? - PullRequest
0 голосов
/ 08 июня 2018

В R, скажем, у вас есть матрица A:

A <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18), nrow=6, ncol=3)

и другая матрица B:

B <- matrix(c(1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 17), nrow=6, ncol=2)

, и вы хотите увидеть, есть ли в каждой строке значения в Aявляются одним из значений соответствующей строки в B, проверяя каждое значение отдельно.

Например, вы хотели бы видеть, равны ли значения в первой строке A (1, 7, 13) 1 или 7 (первая строка B).

Как вы могли бы это сделать?

Моя проблема в том, что два матрица не имеют одинаковый размер, и я хотел бы получить матрицу размером A, которая содержит либо ИСТИНА, либоЛОЖЬ.

Например: первая строка этой матрицы результатов C будет (ИСТИНА, ИСТИНА, ЛОЖЬ), поскольку 1 равно 1 или 7, 7 равно 1 или 7, но 13 не равно 1или 7.

Я пробовал решения с% в%, но, поскольку я довольно новичок в RI, я не смог выяснить, как применить его к каждой строке, а не только к первой.Решение с "==" также не сработало, потому что матрицы не имели одинакового размера, и я хочу сравнить каждую ячейку A с обоими числами B, а не ячейкой за ячейкой.

Iочень ценю вашу помощь!

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете использовать sapply() над индексами строк A следующим образом:

sapply(seq(length = nrow(A)), function(x) A[x, ] %in% B[x, ])
#>       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
#> [1,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [2,]  TRUE FALSE FALSE FALSE FALSE FALSE
#> [3,] FALSE FALSE FALSE FALSE FALSE FALSE

В результате получается матрица, в которой каждый столбец соответствует строке в A.Для транспонирования вы можете использовать t()

t(sapply(seq(length = nrow(A)), function(x) A[x, ] %in% B[x, ]) )
#>      [,1]  [,2]  [,3]
#> [1,] TRUE  TRUE FALSE
#> [2,] TRUE FALSE FALSE
#> [3,] TRUE FALSE FALSE
#> [4,] TRUE FALSE FALSE
#> [5,] TRUE FALSE FALSE
#> [6,] TRUE FALSE FALSE
...