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