首页 > 解决方案 > 在 Tidyverse 管道中使用汇总值进行归一化

问题描述

我正在尝试使用 dplyr 来分析实验数据。我当前的数据集代表五名患者。对于每位患者,有两个样品未经处理,有四个经过处理的样品。我想平均未处理的样本,然后将每个患者的所有观察值标准化为未处理样本的平均值。

我很容易获得每位患者的基线:

library(dplyr)
library(magrittr) 
   baselines <-main_table %>%
        filter(Treatment == "N/A") %>%
        group_by(PATIENT.ID) %>%
        summarize(mean_CD4 = mean(CD3pos.CD8neg))

当我回到主表中变异时,引用这些值的有效方法是什么?理想情况下,能够以PATIENT.ID某种方式过滤/选择,而不必指定实际的患者 ID,从一个实验到下一个实验会发生变化?

我一直在做的是将值从汇总表中保存出来,然后使用里面的值mutate,但是这个解决方案是丑陋的。我真的不喜欢像这样对患者 ID 进行硬编码,因为它们会随着实验的变化而变化,并且手动更改它们会引入难以捕捉的错误。

patient_1_baseline <- baselines[[1, 2]]
patient_2_baseline <- baselines[[2, 2]]

main_table %>%
    mutate(percent_of_baseline = ifelse(
        PATIENT.ID == "108", CD3pos.CD8neg / patient_1_basline * 100,
        ifelse(PATIENT.ID == "patient_2", ......

解决此问题的另一种方法是尝试按患者 ID 分组,summarize获取基线,然后mutate,但我也不太清楚如何做到这一点。

这最终是一个更大问题的症状。我已经掌握了tidyverse基础知识,但我正在努力进入下一个层次,在那里我可以处理像这样的更复杂的情况。非常感谢有关此特定场景或全局问题的任何建议。

编辑添加:示例数据集

PATIENT.ID Dose.Day Single.Live.Lymphs CD3pos.CD8neg
1      108    Day 1              42570         24324
2      108    Day 2              36026         20842
3      108    Day 3              40449         22882
4      108    Day 4              52831         32034
5      108      N/A              71348         38340
6      108      N/A              60113         34294    

标签: rdplyrtidyverse

解决方案


用于left_join()将您计算的基线合并回main_table

main_table %>% 
  left_join(baselines, by = "PATIENT.ID")

有关在 R 中合并数据的更多信息, 请参见此处此处。


在这种情况下,另一种方法也可以完全避免需要单独的基线数据集,只需添加带有分组mutate()的基线:

library(tidyverse)

main_table %>% 
  group_by(PATIENT.ID) %>% 
  mutate(baseline = mean(CD3pos.CD8neg[Dose.Day == "N/A"])) %>% 
  mutate(pctbl = CD3pos.CD8neg / baseline * 100)
#> # A tibble: 6 x 6
#> # Groups:   PATIENT.ID [1]
#>   PATIENT.ID Dose.Day Single.Live.Lymphs CD3pos.CD8neg baseline pctbl
#>        <int> <chr>                 <int>         <int>    <dbl> <dbl>
#> 1        108 Day1                  42570         24324    36317  67.0
#> 2        108 Day2                  36026         20842    36317  57.4
#> 3        108 Day3                  40449         22882    36317  63.0
#> 4        108 Day4                  52831         32034    36317  88.2
#> 5        108 N/A                   71348         38340    36317 106. 
#> 6        108 N/A                   60113         34294    36317  94.4

数据:

txt <- "
PATIENT.ID Dose.Day Single.Live.Lymphs CD3pos.CD8neg
1      108     Day1              42570         24324
2      108     Day2              36026         20842
3      108     Day3              40449         22882
4      108     Day4              52831         32034
5      108      N/A              71348         38340
6      108      N/A              60113         34294"

main_table <- read.table(text = txt, header = TRUE,
                         stringsAsFactors = FALSE)

reprex 包(v0.2.0.9000)于 2018 年 7 月 11 日创建。


推荐阅读