2017-08-15 28 views
0

我有一个数据框,其中包含各种主题,每个主题都至少贡献一个组织样本,即血液,心脏,肝脏等,而其中许多组织样本贡献了样本的多个组织。有31个独特的组织,我想创建一个31×31矩阵,指示从单个主题收集的组织对。在行列名称是组织名称的情况下,对角线将给出从中收集组织样本的受试者的总数,并且对角线将包括已经给予两者的受试者的数量(即,如果受试者已经给出了心肺样本,心脏行/列和肺列/行增加1)。到目前为止,我已经能够将数据(使用plyr)获取到数据框counts中,该数据框包括找到的每个唯一对以及贡献了两种组织类型的对象的数量。当SMTS1SMTS2匹配,在Count的值表示组织R - 通过键和更新值在数据框中添加缺失对

> 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] 

这种设置方式的样品的总数,每个31个组织的存在于counts$SMTS1,和counts$SMTS2包含的所有组织中的为此存在一对。你会看到脂肪组织,只有30个条目,表明有一种组织类型,没有发现脂肪组织。

我想要做的是让SMTS1中的每个独特值与31种可能组织中的每一种配对。在所示的情况下,例如,脂肪组织只有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的。此外,我意识到,对于创建的每个新行,这不会为counts$Count值填入0

TL; DR我需要创建所有缺少的成对值并更新第三列,每个行创建0。这些将被用于填充31×31矩阵,显示哪些组织已经从同一个主题收集到一起。

+1

'tidyr :: spread'? –

+0

@RichardTelford我看了这个,看起来好像它会占用我的“计数”数据框架,并基本上将它变成我想要的矩阵,这将非常棒。你知道这将如何处理丢失的钥匙对吗? – cnolte

+2

很确定'tidyr :: complete'会在这里工作,很难测试没有计数的输出 –

回答

2

您可以使用tidyr::gather

#Some simulated data 

library(tidyverse)# will conflict with plyr 
df <- expand.grid(c1 = letters[1:4], c2 = letters[1:4]) %>% 
    mutate(Count = round(runif(16, 1,100))) %>% 
    slice(-c(3, 7, 12))# missing pairs 

df %>% spread(key = c2, value = Count, fill = 0) 

# A tibble: 4 x 5 
     c1  a  b  c  d 
* <fctr> <dbl> <dbl> <dbl> <dbl> 
1  a  5 16 18 16 
2  b 23 38 58 93 
3  c  0  0 81 47 
4  d 78 32  0 34 

fill论点将零在没有数据

相关问题