Побитовая и или аналогичная операция на строках обработки данных в R?

StackOverflow https://stackoverflow.com/questions/8362810

Вопрос

У меня есть две кадры данных 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, нет никакой реальной причины не использовать матрицы. (Опять же, я не знаю много подробностей о вашей конкретной ситуации ...)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top