2017-08-15 5 views
0

私は、それぞれが少なくとも1つの組織サンプル、すなわち血液、心臓、肝臓などに寄与する様々な科目を持つデータフレームを持っていますが、複数の組織の31個のユニークな組織があり、1つの対象から収集された組織のペアを示す31 x 31マトリックスを作成したい。行と列の名前が組織の名前である場合、対角線は組織標本が収集された被験者の総数を示し、オフ対角線は両方を与えた被験者の数を含む(すなわち、被験者は心臓と肺のサンプルを与えていたが、心臓の行/列と肺の列/行の交差点は1だけ増加する)。R - キーと更新値によってデータフレームに欠けているペアを追加する

これまでは、発見されたそれぞれのユニークなペアと、両方の組織タイプに寄与した被験者の数を含むデータフレームcountsにデータ(plyrを使用)を取得できました。 SMTS1SMTS2一致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] 

のサンプルの総数を示し、31個の組織の各々は、counts$SMTS1中に存在し、そしてcounts$SMTS2は、組織のすべてを含みますペアが存在します。脂肪組織には30項目のみがあり、脂肪組織では見つからない組織タイプが1つあることを示しています。

私がしたいことは、SMTS1のそれぞれのユニークな値が31の可能な組織のそれぞれとペアになるようにすることです。示されている場合、例えば、脂肪組織は30対しかなく、1対が存在しないことを示す。この場合、そのペアはBone Marrowです。私が望む何を、そして、二つの追加列ペアが存在しないことを示す0値を与える

 SMTS1   SMTS2  Count 
1 Adipose Tissue  Bone Marrow  0 
2 Bone Marrow  Adipose Tissue 0 

を作成する、ことを認識すると、私のcountsデータフレーム用です。そこから、私は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作成された行ごとにペアのない値をすべて作成し、第3列を0で更新する必要があります。これらは、どの組織が同じ被験者から集められたかを示す31×31行列を記入するために使用されます。

+1

'tidyr :: spread'がない場合にはゼロを置く使用することができますか? –

+0

@RichardTelford私はこれを見て、それは私の 'counts'データフレームを取り、基本的には私が望むマトリックスに変えたように見えますが、これはすばらしいでしょう。これが欠けているキーペアをどのように処理するのか知っていますか? – cnolte

+2

かなり正確な 'tidyr :: complete'はここで動作し、' dput'カウントなしでテストするのは難しいです。 –

答えて

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引数がデータ

関連する問題