R中数据帧行的按位AND或类似操作?

时间:2011-12-02 21:19:50

标签: r vector bit-manipulation dataframe operation

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

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

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

目前,我正在循环遍历行和列,并测试两者是否为B

这很有效,但我想有一种更有效的方法。有没有办法在数据帧的行向量上执行相当于“按位AND”操作,这会返回一个行向量,我可以将其重新放回到新的数据帧中?或者还有另一种更智能(和更有效)的方法吗?

修改

矩阵乘法比我最初的方法快得多。排序是实现这项工作的关键。

1

2 个答案:

答案 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数据,则没有真正的理由不使用矩阵。 (然后,我不知道有关您具体情况的许多细节......)