基于二元矩阵的两列创建意外事件 table

Creation of a contingency table based on two columns of a binary matrix

我有一个二进制矩阵:

      S1 S2 S3 S4 S5 D1 D2 D3 D4
obs1  0  0  0  1  0  0  1  0  0
obs2  0  1  0  0  0  1  0  0  0
obs3  0  0  1  0  0  0  0  1  0
obs4  0  0  0  1  0  0  1  0  0
obs5  0  1  0  0  0  0  1  0  0
obs6  0  0  0  1  0  0  1  0  0

矩阵的每一行必须包含 S 组(S1、S2、S3、S4 或 S5)的值 1 和 D 组(D1、D2、D3 或 D4)的值 1。

如何根据出现值 1 的二进制矩阵的两列为两个组创建意外事件 table?即,我想要这种 table 格式:

   D1 D2 D3 D4
S1 0  0  0  0
S2 1  1  0  0
S3 0  0  1  0
S4 0  3  0  0
S5 0  0  0  0

这里,例如,值3来自obs1、obs4和obs6,其中(S4,D2)对同时取1作为值。

你可以试试:

table(cbind.data.frame(
  S=factor(max.col(x[,1:5]),levels=1:5,labels=paste0("S",1:5)),
  D=factor(max.col(x[,6:9]),levels=1:4,labels=paste0("D",1:4))
))
#    D
#S    D1 D2 D3 D4
#  S1  0  0  0  0
#  S2  1  1  0  0
#  S3  0  0  1  0
#  S4  0  3  0  0
#  S5  0  0  0  0

嵌套apply

 t(apply(df[2:6], 2, function(x) apply(df[7:10], 2, function(y) sum(x==1 & y ==1))))
   D1 D2 D3 D4
S1  0  0  0  0
S2  1  1  0  0
S3  0  0  1  0
S4  0  3  0  0
S5  0  0  0  0