R 将2列数据帧转换为对称二进制矩阵

R 将2列数据帧转换为对称二进制矩阵,r,R,我试图在R中创建一个对称矩阵,如果列a=dataSet1和列B=dataSet2同时出现在同一行中,则在矩阵中设置为1,否则为0。然而,我似乎无法理解R中的tcrossprod()函数。我已经能够使用table来生成不对称矩阵,但(对称/平方)矩阵却没有成功 我尝试了以下示例,但没有成功: 我的数据: structure(list(dataSet1 = c("g14773.t1", "g6302.t1", "g399.t1", "g15590.t1", "g2595.t1", "g14

我试图在R中创建一个对称矩阵,如果列a=dataSet1和列B=dataSet2同时出现在同一行中,则在矩阵中设置为1,否则为0。然而,我似乎无法理解R中的tcrossprod()函数。我已经能够使用table来生成不对称矩阵,但(对称/平方)矩阵却没有成功

我尝试了以下示例,但没有成功:

我的数据:

   structure(list(dataSet1 = c("g14773.t1", "g6302.t1", "g399.t1", 
"g15590.t1", "g2595.t1", "g149.t1"), dataSet2 = c("g6302.t1", 
"g14773.t1", "g482.t1", "g14053.t1", "g1006.t1", "g6302.t1")), .Names = c("dataSet1", 
"dataSet2"), row.names = c(NA, -6L), class = "data.frame")
无论何时使用tcrossprod函数,都会出现不正确的二进制文件,并且缺少值:

 tcrossprod(table(head(Data)))
              dataSet2
  dataSet1    g14773.t1 g149.t1 g15590.t1 g2595.t1 g399.t1 g6302.t1
  g14773.t1         1       1         0        0       0        0
  g149.t1           1       1         0        0       0        0
  g15590.t1         0       0         1        0       0        0
  g2595.t1          0       0         0        1       0        0
  g399.t1           0       0         0        0       1        0
  g6302.t1          0       0         0        0       0        1 
关于如何使其成为对称矩阵的任何建议如下:

structure(list(g14773.t1 = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L), g6302.t1 = c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), g399.t1 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), g15590.t1 = c(0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), g2595.t1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), g149.t1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), g482.t1 = c(0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), g14053.t1 = c(0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L), g1006.t1 = c(0L, 0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L)), .Names = c("g14773.t1", "g6302.t1", "g399.t1", "g15590.t1", 
"g2595.t1", "g149.t1", "g482.t1", "g14053.t1", "g1006.t1"), class = "data.frame", row.names = c("g14773.t1", 
"g6302.t1", "g399.t1", "g15590.t1", "g2595.t1", "g149.t1", "g482.t1", 
"g14053.t1", "g1006.t1")) 

您可以将列
df$dataSet1
df$dataSet2
转换为
factor
,指定它们的级别是两列中的值的并集。然后只需使用
表格

df$dataSet1 = factor(df$dataSet1,levels=union(df$dataSet1,df$dataSet2))
df$dataSet2 = factor(df$dataSet2,levels=union(df$dataSet1,df$dataSet2))
res = table(df)
将包含一个计数而不是一个0/1值,因此,例如,如果两个值同时出现两次,则矩阵中的值将为2。 如果这是一个问题,您可以添加:

res[res>0] = 1
结果:

           dataSet2
dataSet1    g14773.t1 g6302.t1 g399.t1 g15590.t1 g2595.t1 g149.t1 g482.t1 g14053.t1 g1006.t1
  g14773.t1         0        1       0         0        0       0       0         0        0
  g6302.t1          1        0       0         0        0       0       0         0        0
  g399.t1           0        0       0         0        0       0       1         0        0
  g15590.t1         0        0       0         0        0       0       0         1        0
  g2595.t1          0        0       0         0        0       0       0         0        1
  g149.t1           0        1       0         0        0       0       0         0        0
  g482.t1           0        0       0         0        0       0       0         0        0
  g14053.t1         0        0       0         0        0       0       0         0        0
  g1006.t1          0        0       0         0        0       0       0         0        0

谢谢你的帮助,我甚至都没想过要做联盟。是的,定义因子的级别就是关键。默认情况下,
table
将保留所有级别,即使未使用。