R-按键在数据帧中添加缺失对并更新值

R-按键在数据帧中添加缺失对并更新值,r,dataframe,merge,R,Dataframe,Merge,我有一个数据框架,包含了不同的受试者,每个受试者提供了至少一个组织样本,即血液、心脏、肝脏等,而其中许多人提供了多个组织的样本。有31个独特的组织,我想创建一个31 x 31的矩阵,表示从单个受试者收集的组织对。行名和列名是组织的名称,那么,对角线将给出从中采集组织样本的受试者总数,非对角线将包括同时采集组织样本和列名的受试者人数(即,如果受试者提供了心脏和肺样本,则心脏行/列和肺列/行的交点将增加1) 到目前为止,我已经能够获得数据(使用plyr)在数据框中,计数,其中包括找到的每一对独特的组

我有一个数据框架,包含了不同的受试者,每个受试者提供了至少一个组织样本,即血液、心脏、肝脏等,而其中许多人提供了多个组织的样本。有31个独特的组织,我想创建一个31 x 31的矩阵,表示从单个受试者收集的组织对。行名和列名是组织的名称,那么,对角线将给出从中采集组织样本的受试者总数,非对角线将包括同时采集组织样本和列名的受试者人数(即,如果受试者提供了心脏和肺样本,则心脏行/列和肺列/行的交点将增加1)

到目前为止,我已经能够获得数据(使用
plyr
)在数据框中,
计数
,其中包括找到的每一对独特的组织,以及贡献两种组织类型的受试者数量。当
SMTS1
SMTS2
匹配时,
计数
中的值表示该组织的样本总数

> 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对,表明其中一对不存在。在这种情况下,这对是骨髓。那么,我想对我的
计数
数据帧,upon认识到这一点,再创建两行

        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)
#31个组织的载体

纸巾您可以使用
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
#一些模拟数据
图书馆(tidyverse)#将与plyr发生冲突
df%
突变(计数=舍入(runif(161100)))%>%
切片(-c(3,7,12))#缺失对
df%>%排列(键=c2,值=计数,填充=0)
#一个tibble:4x5
c1 a b c d
*     
1 a 5 16 18 16
2B23385893
3C008147
4 d 78 32 0 34

fill
参数将零放在没有数据的地方

您可以使用
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
#一些模拟数据
图书馆(tidyverse)#将与plyr发生冲突
df%
突变(计数=舍入(runif(161100)))%>%
切片(-c(3,7,12))#缺失对
df%>%排列(键=c2,值=计数,填充=0)
#一个tibble:4x5
c1 a b c d
*     
1 a 5 16 18 16
2B23385893
3C008147
4 d 78 32 0 34

fill
参数将零放在没有数据的地方

tidyr::spread
?@RichardTelford我查了一下这个,它看起来好像会把我的
计数
数据帧基本上变成我想要的矩阵,这太棒了。你知道这将如何处理丢失的密钥对吗?非常确定
tidyr::complete
在这里可以工作,如果没有counts@RichardTelford哇。好了,就这样,我完成了。太不可思议了。如果你把这个作为答案,我会很乐意接受的。谢谢你!
tidyr::spread
?@RichardTelford我查了一下这个,它看起来好像需要我的
计数
数据框架并基本上将其转换为我想要的矩阵,这将非常棒。你知道这将如何处理丢失的密钥对吗?非常确定
tidyr::complete
将在这里工作,如果没有counts@RichardTelford哇。好了,就这样,我完了。真是难以置信。如果你把这个作为答案,我我很乐意接受。谢谢!