【问题标题】:R: given a matrix of 0 and 1s create matrix showing repetition between columns in rowsR:给定一个 0 和 1 的矩阵,创建显示行中列之间重复的矩阵
【发布时间】:2020-01-01 16:29:30
【问题描述】:

设置

标题信息量不大,所以我愿意编辑它。假设我有以下数据框

m <- matrix(c(1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1), nrow=3, ncol=4, 
            dimnames = list(c("row1", "row2", "row3"), c("col1", "col2", "col3", "col4")))
df <- data.frame(m)

看起来像这样

     col1 col2 col3 col4
row1    1    0    1    0
row2    0    1    0    0
row3    1    0    1    1

我想做什么

我想获得类似的东西(对角线可以有所有0s 或所有1s,我不在乎)。

       col1  col2  col3  col4
col1      0     0     2     1
col2      0     0     0     0
col3      2     0     0     1
col4      1     0     1     0

基本上,如果任何两列在同一行上有一个1(例如col1col3row1row1 上都有一个1),那么我们将+1 添加到相应的在上面的矩阵中输入。基本上,最终矩阵计算每列与其他列在同一行上具有1s 的次数。

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    一个选项是crossprod 转换为matrix 然后将diagonal 元素更改为0

    `diag<-`(crossprod(as.matrix(df)), 0)
    #     col1 col2 col3 col4
    #col1    0    0    2    1
    #col2    0    0    0    0
    #col3    2    0    0    1
    #col4    1    0    1    0
    

    【讨论】:

    • 你能解释一下这段代码吗?我很迷茫。我以为crossprod 计算t(m) %*% m
    • 我不敢相信这段代码有效!我当前的函数大约有 30 行长,其中包括 outer、循环和许多其他内容..
    • @Euler_Salter 如果勾选?crossprod,'y'可以为NULL crossprod(x, y = NULL)
    • 类似于t(df) %*% as.matrix(df),但效率更高
    • @Euler_Salter。我可以分两步完成作业,即out &lt;- crossprod(as.matrix(df)); diag(out) &lt;- 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2017-03-13
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多