R 将2列数据帧转换为对称二进制矩阵
我试图在R中创建一个对称矩阵,如果列a=dataSet1和列B=dataSet2同时出现在同一行中,则在矩阵中设置为1,否则为0。然而,我似乎无法理解R中的tcrossprod()函数。我已经能够使用table来生成不对称矩阵,但(对称/平方)矩阵却没有成功 我尝试了以下示例,但没有成功: 我的数据: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
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
将保留所有级别,即使未使用。