【问题标题】:co-occurrence matrix of numbers in the same group R同组数字的共现矩阵 R
【发布时间】:2018-05-28 07:35:14
【问题描述】:

数据框中的每一行(我可以转换成数组)表示组。 我想创建一个“n x n”矩阵(n 是数据中显示的最大数字)。 这个矩阵会告诉我两个数字一起出现了多少组。

例如在第一组(第一行)中,出现了5和9、5和23、5和32、5和33、9和23、9和32、9和33……等等在一起。

所以在输出矩阵上,这将如下所示:

(这个矩阵只是一个例子,它不是根据上面的数据。) 就像我说的,每个数字表示这两个数字一起出现的组数。

我一直在谷歌上搜索,但仍然很难。 请帮我解决这个问题,,,(使用python或R)

【问题讨论】:

  • 请将示例输入和输出数据共享为可重现的代码,而不是两个完全不相关的图像数据。
  • 我很困惑。我不清楚。
  • 对不起,我会编辑这篇文章,提供更清晰的解释和可重复的数据。

标签: python arrays r dataframe matrix


【解决方案1】:

我不确定我是否完全理解您想要的输出。在下面的解决方案中,计算每行项目的二进制出现,然后总结所有行中项目的(二进制)共现。这是你要找的吗?

代码可能会写得更优雅和加速(例如,一直使用data.table),但至少是一个开始。

mat <- rbind(c(1,1,2,2), c(2,2,3,3), c(2,1,1,4))
#       [,1] [,2] [,3] [,4]
# [1,]    1    1    2    2
# [2,]    2    2    3    3
# [3,]    2    1    1    4

mat_tab_row <- apply(mat, 1, function(x) {

           items <- unique(x)
           data.frame(matrix(t(rep(1, length(items)))
                             , nrow = 1 
                             , dimnames = list(1, items)))  
})

# [[1]]
#    X1 X2
# 1  1  1
# 
# [[2]]
#    X2 X3
# 1  1  1
# 
# [[3]]
#    X2 X1 X4
# 1  1  1  1

library(data.table)
mat_tab <- as.matrix(rbindlist(mat_tab_row, fill = T))
mat_tab[ is.na(mat_tab)] <- 0
#      X1 X2 X3 X4
# [1,]  1  1  0  0
# [2,]  0  1  1  0
# [3,]  1  1  0  1

t(mat_tab) %*% mat_tab
#     X1 X2 X3 X4
# X1  2  2  0  1
# X2  2  3  1  1
# X3  0  1  1  0
# X4  1  1  0  1 

【讨论】:

    【解决方案2】:

    在 R 中,也许可以尝试

    n <- 5
    set.seed(1)
    (m <- matrix(sample(seq_len(n*2), n*n, T), ncol = n))
    #      [,1] [,2] [,3] [,4] [,5]
    # [1,]    3    9    3    5   10
    # [2,]    4   10    2    8    3
    # [3,]    6    7    7   10    7
    # [4,]   10    7    4    4    2
    # [5,]    3    1    8    8    3
    co <- tcrossprod(apply(m, 1, `%in%`, x=seq(1L, max(m))))
    diag(co) <- 0L
    co
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]    0    0    1    0    0    0    0    1    0     0
    # [2,]    0    0    1    2    0    0    1    1    0     2
    # [3,]    1    1    0    1    1    0    0    2    1     2
    # [4,]    0    2    1    0    0    0    1    1    0     2
    # [5,]    0    0    1    0    0    0    0    0    1     1
    # [6,]    0    0    0    0    0    0    1    0    0     1
    # [7,]    0    1    0    1    0    1    0    0    0     2
    # [8,]    1    1    2    1    0    0    0    0    0     1
    # [9,]    0    0    1    0    1    0    0    0    0     1
    #[10,]    0    2    2    2    1    1    2    1    1     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多