r - 交叉比较相同数据框的列

我有一个如下所示的 data.frame:

> DF1      

 A    B    C    D    E     
 a    x    c    h    p 
 c    d    q    t    w
 s    e    r    p    a
 w    l    t    s    i
 p    i    y    a    f

我想将我的 data.frame 的每一列与其余列进行比较,以计算公共(public)元素的数量。例如,我想将 A 列与所有剩余列(B、C、D、E)进行比较,并以这种方式计算共同实体:

A 与其余:

  • A vs B:0(因为它们有 0 个共同元素)
  • A vs C:1(c 相同)
  • A 与 D:2(p 和 s 相同)
  • A vs E:3(p,w,a,共同点)

然后相同:B 与 C、D、E 列等。

我该如何实现?

最佳答案

我们可以遍历列名并与其他列进行比较,方法是取 intersect 并获取 length

sapply(names(DF1), function(x) {
    x1 <- lengths(Map(intersect, DF1[setdiff(names(DF1), x)], DF1[x]))
    c(x1, setNames(0, setdiff(names(DF1), names(x1))))[names(DF1)]})
#  A B C D E
#A 0 0 1 3 3
#B 0 0 0 0 1
#C 1 0 0 1 0
#D 3 0 1 0 2 
#E 3 1 0 2 0

或者这可以通过在获取长格式(melt)数据集的频率后取叉积来更紧凑地完成

library(reshape2)
tcrossprod(table(melt(as.matrix(DF1))[-1])) * !diag(5)
#    Var2
#Var2 A B C D E
#   A 0 0 1 3 3
#   B 0 0 0 0 1
#   C 1 0 0 1 0
#   D 3 0 1 0 2
#   E 3 1 0 2 0

注意:crossprod 部分也是用 RcppEigen 实现的 here这会让这个更快

https://stackoverflow.com/questions/43658982/

相关文章:

regex - 正则表达式 : convert a list of name and value p

docker - 在 alpine 容器中使用 confluent-kafka python 客户端

java - 使用 lambda 计算列表中的列表

sql - 为什么我需要在重命名之前将数据库设置为 single_user?

java - 找不到属性 : Error in spring boot 的设置方法

pymc3 - BetaBinomial 和 "Beta and Binomial"之间的区别

java - 将 long 列表转换为 double 列表

atom-editor - 原子氢 : How is "run cell" used?

python-3.x - 为什么 Python 找到与 Windows 不同的文件大小?

azure - 在 Debian 上安装 AzureAD 模块