【问题标题】:Create a co-occurrence matrix from dummy-coded observations从虚拟编码观察创建一个共现矩阵
【发布时间】:2012-05-24 06:18:51
【问题描述】:

是否有一种简单的方法可以将具有关于是否存在方面的虚拟数据帧(二进制编码)转换为包含同时出现的两个方面的计数的共现矩阵?

例如从此开始

X <- data.frame(rbind(c(1,0,1,0), c(0,1,1,0), c(0,1,1,1), c(0,0,1,0)))
X
  X1 X2 X3 X4
1  1  0  1  0
2  0  1  1  0
3  0  1  1  1
4  0  0  1  0

到这里

   X1 X2 X3 X4
X1  0  0  1  0
X2  0  0  2  1
X3  1  2  0  1
X4  0  1  1  0

【问题讨论】:

    标签: r


    【解决方案1】:

    这样就可以了:

    X <- as.matrix(X)
    out <- crossprod(X)  # Same as: t(X) %*% X
    diag(out) <- 0       # (b/c you don't count co-occurrences of an aspect with itself)
    out
    #      [,1] [,2] [,3] [,4]
    # [1,]    0    0    1    0
    # [2,]    0    0    2    1
    # [3,]    1    2    0    1
    # [4,]    0    1    1    0
    

    要将结果完全像您展示的那样放入 data.frame 中,您可以执行以下操作:

    nms <- paste("X", 1:4, sep="")
    dimnames(out) <- list(nms, nms)
    out <- as.data.frame(out)
    

    【讨论】:

    • 有趣的是,对角线只是 X 的列总和。
    • 非常好;简单轻松+1
    • @bdemarest -- 考虑与方差-协方差矩阵的相似性也很有趣,它们仅在计算 t(X) %*% X 之前将列居中不同。
    【解决方案2】:

    虽然没有什么能比得上上面简单的答案,只是发布tidyverse 方法以供将来参考

    Y <- X %>% mutate(id = row_number()) %>%
      pivot_longer(-id) %>% filter(value !=0)
    
    merge(Y, Y, by = "id", all = T) %>%
      filter(name.x != name.y) %>%
      group_by(name.x, name.y) %>%
      summarise(val = n()) %>%
      pivot_wider(names_from = name.y, values_from = val, values_fill = 0, names_sort = T) %>%
      column_to_rownames("name.x")
    
       X1 X2 X3 X4
    X1  0  0  1  0
    X2  0  0  2  1
    X3  1  2  0  1
    X4  0  1  1  0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2018-11-18
      相关资源
      最近更新 更多