【发布时间】:2017-08-15 14:56:15
【问题描述】:
我有一个包含不同主题的数据框,每个主题都提供了至少一个组织样本,即血液、心脏、肝脏等,而他们中的许多人提供了多个组织的样本。有 31 个独特的组织,我想创建一个 31 x 31 矩阵,指示从单个受试者收集的组织对。如果行名和列名是组织的名称,那么对角线将给出从其中收集组织样本的受试者总数,而对角线将包括同时给出这两种名称的受试者的数量(即,如果受试者已经给出了心脏和肺样本,心脏行/列和肺列/行的交集将增加1)。
到目前为止,我已经能够将数据(使用plyr)放入数据框counts 中,其中包括找到的每对独特的配对,以及贡献了两种组织类型的受试者数量。当SMTS1和SMTS2匹配时,Count中的值表示该组织的样本总数
> head(counts, n = 32L)
SMTS1 SMTS2 Count
1 Adipose Tissue Adipose Tissue 439
2 Adipose Tissue Adrenal Gland 137
3 Adipose Tissue Bladder 11
4 Adipose Tissue Blood 423
5 Adipose Tissue Blood Vessel 368
6 Adipose Tissue Brain 146
7 Adipose Tissue Breast 190
8 Adipose Tissue Cervix Uteri 8
9 Adipose Tissue Colon 248
10 Adipose Tissue Esophagus 341
11 Adipose Tissue Fallopian Tube 6
12 Adipose Tissue Heart 266
13 Adipose Tissue Kidney 33
14 Adipose Tissue Liver 119
15 Adipose Tissue Lung 285
16 Adipose Tissue Muscle 380
17 Adipose Tissue Nerve 290
18 Adipose Tissue Ovary 99
19 Adipose Tissue Pancreas 174
20 Adipose Tissue Pituitary 102
21 Adipose Tissue Prostate 105
22 Adipose Tissue Salivary Gland 64
23 Adipose Tissue Skin 423
24 Adipose Tissue Small Intestine 97
25 Adipose Tissue Spleen 110
26 Adipose Tissue Stomach 182
27 Adipose Tissue Testis 168
28 Adipose Tissue Thyroid 290
29 Adipose Tissue Uterus 81
30 Adipose Tissue Vagina 86
31 Adrenal Gland Adipose Tissue 137
32 Adrenal Gland Adrenal Gland 159
... [823 Additional Rows]
按照这种设置方式,counts$SMTS1 中存在 31 个组织中的每一个,counts$SMTS2 包含存在一对的所有组织。您会看到对于 Adipose Tissue,只有 30 个条目,这表明有一种组织类型在 Adipose Tissue 中找不到。
我想做的是让SMTS1 中的每个唯一值都与 31 种可能的组织中的每一种配对。例如,在所示的情况下,Adipose Tissue 只有 30 对,表明其中不存在一对。在这种情况下,那对是骨髓。那么,我想要的是我的counts 数据框,在认识到这一点后,再创建两行
SMTS1 SMTS2 Count
1 Adipose Tissue Bone Marrow 0
2 Bone Marrow Adipose Tissue 0
给出0 值表示一对不存在。从那里,我应该有 961 个数值,最终将成为我的 31 x 31 矩阵的条目。
这是我尝试过的
# Vector of 31 Tissues
tissues <- names(sampleTypes)
names(tissues) <- c("SMTS2")
# Replicate 31 times, one for each unique tissue in SMTS1
rep.tissues <- rep(tissues, 31)
# Make data frame column for merge
rep.df <- as.data.frame(t(rep.tissues)
names(rep.df) <- "SMTS2"
# Merge
match <- merge(counts, rep.df, by = "SMTS2", all.x = TRUE)
但是,由于重复,此输出很大,删除这些,我留下了一个与原始 counts 相同的数据框。此外,我意识到这对于为每个创建的新行填充 0 值没有任何作用。
TL;DR 我需要创建所有缺失的成对值,并使用 0 为创建的每一行更新第三列。这些将用于填充一个 31 x 31 的矩阵,显示哪些组织是从同一受试者身上收集的。
【问题讨论】:
-
tidyr::spread? -
@RichardTelford 我查了这个,看起来好像它会占用我的
counts数据框,基本上把它变成我想要的矩阵,这太棒了。你知道这将如何处理丢失的密钥对吗? -
相当肯定
tidyr::complete会在这里工作,如果没有dput的计数就很难测试 -
@RichardTelford 哇。好的,就是这样,我完成了。那太不可思议了。如果您将此作为答案,我将很乐意接受。谢谢!