我有两个数据框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!
您还可以使用逻辑&运算符,这是您正在寻找的“按位与”。您的表达式将类似于 (a & b) + 0
(+ 0
只会从 bool 值转换回整数)。
注意:对于数据帧,其工作方式完全相同。
关于r - R 中数据帧行上的按位 AND 或类似运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362810/