查找列表中数据框之间的匹配行数

时间:2017-05-15 15:59:54

标签: r

我有一个包含N数据帧的列表。对于这个问题,我们看一下N=3以简化,

asd<-list()

asd[[1]]<-data.frame("one"=c(1:3), "two"=c("a","b","c"))
asd[[2]]<-data.frame("one"=c(3:5), "two"=c("c","b","a"))
asd[[3]]<-data.frame("one"=c(5:7), "two"=c("a","b","c"))

我想将这些数据框相互比较并获得一个N x N矩阵,其条目(i,j)告诉我在数据框i和{{1}之间有多少行相同}}。

因此,对于上面我们得到一个带有元素j

的3x3矩阵
(i,j)

我可以在R中使用哪个功能?

2 个答案:

答案 0 :(得分:3)

也许这有帮助

sapply(seq_along(asd), function(i) 
   sapply(seq_along(asd), function(j) sum(rowSums(asd[[i]]==asd[[j]])==2)))

或者可能是

sapply(seq_along(asd), function(i) 
    sapply(seq_along(asd), function(j) sum(duplicated(rbind(asd[[i]], asd[[j]])))))

或另一种选择是

`dim<-`(unlist(do.call(Map, c(f= function(...) 
        sum(duplicated(rbind(...))), expand.grid(asd, asd)))), c(3, 3))

答案 1 :(得分:2)

“list”结构可能更方便用“data.frame”代替:

asd2 = cbind(do.call(rbind, asd), 
             df = rep(seq_along(asd), sapply(asd, nrow)))

如果asd“data.frame”的每一行都可以映射到一个数字,那么问题可以变得更简单:

r = tapply(1:nrow(asd2), asd2[c("one", "two")])

然后,遵循crossprod(table()) approach(或使用稀疏矩阵的变体):

library(Matrix)
crossprod(xtabs( ~ r + df, asd2, sparse = TRUE))
#3 x 3 sparse Matrix of class "dsCMatrix"
#  1 2 3
#1 3 1 .
#2 1 3 1
#3 . 1 3