【问题标题】:R - Add Missing Pairs in Data Frame by Key and Update ValueR - 通过键在数据框中添加缺失对并更新值
【发布时间】:2017-08-15 14:56:15
【问题描述】:

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

到目前为止,我已经能够将数据(使用plyr)放入数据框counts 中,其中包括找到的每对独特的配对,以及贡献了两种组织类型的受试者数量。当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]

按照这种设置方式,counts$SMTS1 中存在 31 个组织中的每一个,counts$SMTS2 包含存在一对的所有组织。您会看到对于 Adipose Tissue,只有 30 个条目,这表明有一种组织类型在 Adipose Tissue 中找不到。

我想做的是让SMTS1 中的每个唯一值都与 31 种可能的组织中的每一种配对。例如,在所示的情况下,Adipose Tissue 只有 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 相同的数据框。此外,我意识到这对于为每个创建的新行填充 0 值没有任何作用。

TL;DR 我需要创建所有缺失的成对值,并使用 0 为创建的每一行更新第三列。这些将用于填充一个 31 x 31 的矩阵,显示哪些组织是从同一受试者身上收集的。

【问题讨论】:

  • tidyr::spread?
  • @RichardTelford 我查了这个,看起来好像它会占用我的counts 数据框,基本上把它变成我想要的矩阵,这太棒了。你知道这将如何处理丢失的密钥对吗?
  • 相当肯定 tidyr::complete 会在这里工作,如果没有 dput 的计数就很难测试
  • @RichardTelford 哇。好的,就是这样,我完成了。那太不可思议了。如果您将此作为答案,我将很乐意接受。谢谢!

标签: r dataframe merge


【解决方案1】:

您可以使用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 参数将零放在没有数据的地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2018-11-04
    • 2018-06-11
    • 1970-01-01
    相关资源
    最近更新 更多