2

我有两个数据框AB,两个相同的维度。不保证行和列标签在帧之间的顺序相同。

两个帧都包含值011表示在帧的行和列之间存在有向“边缘”(因此,0表示没有连接)。

我想找到两个框架共有的“边缘”。换句话说,我想要一个与A和具有相同维度的数据框B,其中包含在 和 的行和列中都有1a 的值。1AB

目前,我正在遍历行和列并测试两者是否都是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
}
4

2 回答 2

4

您可以为此使用正常乘法!:-)

// 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!

您还可以使用逻辑 & 运算符,这是您正在寻找的“按位与”。然后你的表达式看起来像(a & b) + 0+ 0只会从布尔值转换回整数)。

注意:对于数据框,它的工作方式完全相同。

于 2011-12-02T21:26:22.487 回答
0

可能是这样的?

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 数据,那么没有真正的理由不使用矩阵。(话说回来,关于你的具体情况,我不知道很多细节......)

于 2011-12-02T21:24:49.637 回答