如何基于R中其他数据帧中的信息创建矩阵?

时间:2019-09-24 09:05:34

标签: r dataframe matrix assign

我有一个带有基因名称和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 

感谢您的帮助。 thanq。

1 个答案:

答案 0 :(得分:2)

我们可以使用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))
相关问题