我有一个包含基因名称和 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
如果每个 Gene
和 miRNA
有多于一行,请首先使用 distinct
。
df %>%
distinct() %>%
mutate(n = 1) %>%
pivot_wider(names_from = miRNA, values_from = n, values_fill = list(n = 0))
关于r - 如何根据R中其他数据帧中的信息创建矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58076738/