【问题标题】:Find number of matching rows between dataframes in a list查找列表中数据框之间的匹配行数
【发布时间】:2017-05-15 15:59:53
【问题描述】:

我有一个包含 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) 告诉我数据帧ij 之间有多少行相同。

因此,对于上述内容,我们得到一个 3x3 矩阵,其中包含元素 (i,j)

(1,1)=(2,2)=(3,3) 3 (3 rows are identical)
(1,2)=(2,1)       1 (1 row is identical)
(1,3)=(3,1)       0 (0 rows are identical)
(2,3)=(3,2)       1 (0 row is identical)

我可以在 R 中使用哪个函数?

【问题讨论】:

    标签: r


    【解决方案1】:

    也许这有帮助

    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))
    

    【讨论】:

    • 谢谢,这是一个不错的建议。能否推广到asd[[1]], asd[[2]]asd[[3]]长度不同的情况?
    • @BillyJean 我想我的第二个和第三个建议应该适用于具有不同行数的数据集
    【解决方案2】:

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

    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
    

    【讨论】:

    • crossprod 的好方法。你总是想出一些我想不到的点子
    猜你喜欢
    • 2022-09-23
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多