数据框中的每一行(我可以将其转换为数组)表示组。我想创建一个“n x n”矩阵(n是数据中显示的最大数字)。这个矩阵将告诉我两个数字一起出现的组有多少。例如,在第一组(第一行)中,5和9、5和23、5和32、5和33、9和23、9和32、9和33 ......等等一起出现。在输出矩阵中,它看起来像这样:
(This matrix只是一个例子,并不是根据上面的数据)就像我说的,每个数字都表示这两个数字一起出现的组数。我一直在研究这个问题,但没有结果。我可以尝试什么代码,用Python或R?
x6yk4ghg1#
在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
olmpazwi2#
我不确定我是否完全理解您所需的输出。在下面的解决方案中,计算每行中项目的二进制出现次数,然后对所有行中项目的(二进制)共现次数求和。这就是您要查找的内容吗?代码可能会写得更优雅,速度也更快(例如,自始至终使用data.table),但至少这是一个开始。
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条答案
按热度按时间x6yk4ghg1#
在R,也许尝试
olmpazwi2#
我不确定我是否完全理解您所需的输出。在下面的解决方案中,计算每行中项目的二进制出现次数,然后对所有行中项目的(二进制)共现次数求和。这就是您要查找的内容吗?
代码可能会写得更优雅,速度也更快(例如,自始至终使用
data.table
),但至少这是一个开始。