使用汇总值在Tidyverse管道中进行归一化

时间:2018-07-11 09:45:36

标签: r dplyr 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,这些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    

1 个答案:

答案 0 :(得分:1)

使用left_join()将您计算出的基准合并回main_table中:

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

例如参见herehere了解有关在R中合并数据的更多信息。


在这种情况下,另一种方法也可以完全避免使用单独的基线数据集,只需在基线上添加grouped 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 package(v0.2.0.9000)于2018-07-11创建。