Побитовая и или аналогичная операция на строках обработки данных в R?
-
27-10-2019 - |
Вопрос
У меня есть две кадры данных A
а также B
, оба одинаковых измерения. Метки строки и столбца не гарантируются идентично упорядоченные между кадрами.
Обе кадры содержат значения 0
а также 1
, с 1
указывая на то, что между строкой и столбцом кадра существует направленное «край» (и, соответственно, 0
указывая на связь).
Я хотел бы найти «края», общие для обеих рамков. Другими словами, я хочу кадр данных тех же измерений, что и A
а также B
, который содержит 1
ценности, где есть 1
в ряду и столбце обоих A
а также B
.
В настоящее время я пробегаю через ряды и столбцы и тестирую, если оба 1
.
Это работает, но я думаю, что есть более эффективный способ сделать это. Есть ли способ сделать эквивалент «бить и» операции на векторах строк рамков данных, которая возвращает вектор строки, который я могу вернуть в новый кадр данных? Или есть еще один более умный (и эффективный) подход?
РЕДАКТИРОВАТЬ
Умножение матрицы довольно быстрее, чем мой первоначальный подход. Сортировка была ключом к созданию этой работы.
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
}
Решение
Вы можете использовать нормальное умножение для этого! :-)
// generate data
a = matrix(rbinom(100, 1, 0.5), nrow = 10)
b = matrix(rbinom(100, 1, 0.5), nrow = 10)
a * b // this is the result!
Вы также можете использовать Logical & Operator, который является «бить и», вы ищете. Ваше выражение будет выглядеть как (a & b) + 0
( + 0
Будет только преобразовать из Boolean Back в Integer).
Примечание. С DataFrames он работает точно так же.
Другие советы
Может быть, что -то подобное?
df1 <- as.data.frame(matrix(sample(0:1,25,replace = TRUE),5,5))
df2 <- as.data.frame(matrix(sample(0:1,25,replace = TRUE),5,5))
df3 <- matrix(0,5,5)
df3[df1 == 1 & df2 == 1] <- 1
> df3
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 1 1
[3,] 1 1 1 0 0
[4,] 0 1 0 0 0
[5,] 0 0 0 0 0
В итоге я получил матрицу, но вы можете снова преобразовать ее в кадр данных, если это необходимо. Но если вы просто имеете дело с данными 0/1, нет никакой реальной причины не использовать матрицы. (Опять же, я не знаю много подробностей о вашей конкретной ситуации ...)