如何根据 R 中其他数据框中的信息创建矩阵?

How to create a matrix based on information in other dataframe in R?

我有一个包含基因名称和 miRNA 相互作用信息的数据框。数据框如下所示:

df:

Gene      miRNA
ACP1    hsa-let-7a-5p
AGO4    hsa-let-7a-5p
AMMECR1 hsa-let-7a-5p
ATM     hsa-miR-100-5p
BMPR2   hsa-miR-100-5p
AGO1    hsa-miR-107
AGO2    hsa-miR-107
AGO3    hsa-miR-107

利用上面的基因-miRNA相互作用信息,我想做一个矩阵。如果有交互我想分配 1 如果不是 0。矩阵应该如下所示:

          hsa-let-7a-5p hsa-miR-100-5p  hsa-miR-107
ACP1           1              0              0
AGO4           1              0              0
AMMECR1        1              0              0
ATM            0              1              0
BMPR2          0              1              0
AGO1           0              0              1
AGO2           0              0              1 
AGO3           0              0              1

我尝试为此使用 xtabs。无法正确使用。

xtabs(c(1L, 0L)[miRNA] ~ ., data=df)

结果如下所示:

Gene
   ACP1    AGO1    AGO2    AGO3    AGO4 AMMECR1     ATM   BMPR2 
      1       0       0       0       1       1       0       0 

感谢任何帮助。谢谢

我们可以使用 mutate 创建一个虚拟列并使用 pivot_wider 将数据转换为宽格式。

library(dplyr)
library(tidyr) # version ‘1.0.0’

df %>%
  mutate(n = 1) %>%
  pivot_wider(names_from = miRNA, values_from = n, values_fill = list(n = 0))
  #OR
  #spread(miRNA, n, fill = 0) in old tidyr


#  Gene    `hsa-let-7a-5p` `hsa-miR-100-5p` `hsa-miR-107`
#  <fct>             <dbl>            <dbl>         <dbl>
#1 ACP1                  1                0             0
#2 AGO4                  1                0             0
#3 AMMECR1               1                0             0
#4 ATM                   0                1             0
#5 BMPR2                 0                1             0
#6 AGO1                  0                0             1
#7 AGO2                  0                0             1
#8 AGO3                  0                0             1

如果 GenemiRNA 各有一行以上,请先使用 distinct

df %>%
  distinct() %>%
  mutate(n = 1) %>%
  pivot_wider(names_from = miRNA, values_from = n, values_fill = list(n = 0))