我有两个数据帧A
和B
,都是相同的尺寸。行和列标签不保证在帧之间按相同顺序排列。R中的数据帧行按位与或类似操作?
两个帧包含值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
}
是的,这样比较好。 :) – joran
谢谢,@joran :-)这个例子显示R是非常优雅的语言,我喜欢享受它的优雅:-) – TMS
谢谢,这是非常有道理的,我只需要以相同的方式排序两个帧,所以结果是正确的。 –