2017-08-15 55 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論點將零在沒有數據

相關問題