【问题标题】:Bitwise AND or similar operation on data-frame rows in R?R中数据帧行的按位与或类似操作?
【发布时间】:2011-12-02 21:19:49
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: r vector bit-manipulation dataframe operation


    【解决方案1】:

    你可以使用正常的乘法! :-)

    // 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 &amp; b) + 0+ 0 只会从布尔值转换回整数)。

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

    【讨论】:

    • 谢谢,@joran :-) 这个例子表明 R 是非常优雅的语言,我喜欢享受它的优雅 :-)
    • 谢谢,这很有道理,我只需要以相同的方式对两个框架进行排序,这样结果就正确了。
    • 请注意,您不应将 &amp; 与 C 中的“按位与”运算符 &amp; 混淆。您可以从带有函数 bitAnd()bitops 包中获得它。跨度>
    • @Sacha,是的,我们应该说“elementwise”而不是“bitwise”才是正确的,但我认为我们通过 OP 相互理解......
    • 是的,这更多地意味着人们随机搜索“按位和 R 中”或其他内容,而不是阅读整个帖子:)
    【解决方案2】:

    可能是这样的吗?

    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 数据,那么没有真正的理由不使用矩阵。 (话说回来,我对你的具体情况了解的不多……)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2020-02-10
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 2021-10-01
      相关资源
      最近更新 更多