我有一个包含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
(i,j)
我可以在R中使用哪个功能?
答案 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