【问题标题】:Use summarized value to normalize in Tidyverse pipeline在 Tidyverse 管道中使用汇总值进行归一化
【发布时间】:2018-07-11 09:45:36
【问题描述】:

我正在尝试使用 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    

【问题讨论】:

  • 请分享(部分)您的示例数据。
  • @MauritsEvers 表示共享为 包含在您的问题中,以便其他人可以运行它。请参阅 here 了解出色的示例。
  • 我编辑了这个问题,因为它在 cmets 中看起来很糟糕,谢谢

标签: r dplyr tidyverse


【解决方案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 年 7 月 11 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多