У меня есть два фрейма данных A
и B
, оба одинакового размера. Не гарантируется одинаковое расположение меток строк и столбцов между кадрами.
Оба кадра содержат значения 0
и 1
, причем 1
указывает на наличие направленного «ребра» между строкой и столбцом кадра (и, соответственно, 0
указывает на отсутствие соединения).
Я бы хотел найти "ребра", общие для обоих кадров. Другими словами, мне нужен фрейм данных тех же измерений, что и A
и B
, которые содержат 1
значения, в которых есть 1
в строке и столбце обоих A
и B
.
В настоящее время я перебираю строки и столбцы и проверяю, оба ли они 1
.
Это работает, но я думаю, что есть более эффективный способ сделать это. Есть ли способ сделать эквивалент операции «побитовое И» над векторами строк фреймов данных, которая возвращает вектор строк, который я могу вставить обратно в новый фрейм данных? Или есть другой, более разумный (и эффективный) подход?
EDIT
Матричное умножение происходит намного быстрее, чем мой первоначальный подход. Сортировка была ключом к созданию этой работы.
findCommonEdges <- function(edgesList) {
edgesCount <- length(edgesList)
print("finding common edges...")
for (edgesIdx in 1:edgesCount) {
print(paste("...searching against frame", edgesIdx, sep=" "))
edges <- edgesList[[edgesIdx]]
if (edgesIdx == 1) {
# define commonEdges data frame as copy of first frame
commonEdges <- edges
next
}
#
# we reorder edge data frame row and column labels
# to do matrix multiplication and find common edges
#
edges <- edges[order(rownames(commonEdges)), order(colnames(commonEdges))]
commonEdges <- commonEdges * edges
}
commonEdges
}