【问题标题】:Convert a 2 column dataframe into a symmetric binary matrix将 2 列数据帧转换为对称二进制矩阵
【发布时间】:2017-12-08 23:26:51
【问题描述】:

我正在尝试在 R 中创建一个对称矩阵,其中如果列 A=dataSet1 和列 B=dataSet2 一起出现在同一行中,则在矩阵中设置为 1,否则为 0。但是,我似乎不能了解 R 中的 tcrossprod() 函数。我已经能够使用 table 来制作非对称矩阵,但(对称/方形)矩阵没有运气。

我尝试按照这个示例进行操作,但没有成功: Building a symmetric binary matrix

我的数据:

   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")) 

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以将列 df$dataSet1df$dataSet2 转换为 factor,指定它们的级别是在两列中找到的值的并集。然后只需使用table:

    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)
    

    Table 将包含一个计数而不是 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 将保留所有级别,即使未使用。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2015-06-01
    • 2020-04-21
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2015-05-13
    • 2018-06-30
    相关资源
    最近更新 更多