我有两个相同维度的数据框A
和B
。不保证行和列标签在帧之间按相同顺序排列。
两个框架都包含值0
和1
,其中1
表示框架的行和列之间存在定向“边缘”(因此,{{1}表示没有连接)。
我想找到两个框架共有的“边缘”。换句话说,我想要一个与0
和A
具有相同维度的数据框,其中包含B
个值,其中两个行和列都有1
1
和A
。
目前,我正在循环遍历行和列,并测试两者是否为B
。
这很有效,但我想有一种更有效的方法。有没有办法在数据帧的行向量上执行相当于“按位AND”操作,这会返回一个行向量,我可以将其重新放回到新的数据帧中?或者还有另一种更智能(和更有效)的方法吗?
修改
矩阵乘法比我最初的方法快得多。排序是实现这项工作的关键。
1
答案 0 :(得分: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
只会从布尔值转换回整数)。
注意:对于数据框,它的工作方式完全相同。
答案 1 :(得分: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数据,则没有真正的理由不使用矩阵。 (然后,我不知道有关您具体情况的许多细节......)