r - 通过控制组将整个数据帧划分为几个子组中的每一个

标签 r dplyr

起始数据

我正在 R 工作,我有一组由接受不同剂量不同药物治疗的动物组(队列)生成的数据。我的数据集的简化可重现示例如下:

# set starting values for simulation of animal cohorts across doses of various drugs with a few numeric endpoints
cohort_size <- 3
animals <- letters[1:cohort_size]
drugs <- factor(c("A", "B", "C"))
doses <- factor(c(0, 10, 100))
total_size <- cohort_size * length(drugs) * length(doses)

# simulate data based on above parameters
df <- cbind(expand.grid(drug = drugs, dose = doses, animal = animals),
            data.frame(
              other_metadata = sample(LETTERS[24:26], size = total_size, replace = TRUE),
              num1 = rnorm(total_size, mean = 10, sd = 3), 
              num2 = rnorm(total_size, mean = 60, sd = 9),
              num3 = runif(total_size, min = 1, max = 5)))

这会产生类似的结果:

##   drug dose animal other_metadata      num1     num2     num3
## 1    A    0      a              X  6.448411 54.49473 4.111368
## 2    B    0      a              Y  9.439396 67.39118 4.917354
## 3    C    0      a              Y  8.519773 67.11086 3.969524
## 4    A   10      a              Z  6.286326 69.25982 2.194252
## 5    B   10      a              Y 12.428265 70.32093 1.679301
## 6    C   10      a              X 13.278707 68.37053 1.746217

我的目标

对于每种药物治疗,我将 dose == 0 动物视为该药物的对照组(假设每种药物在不同的时间进行,并且有自己的对照组)。我希望计算对照组每个数字端点(本例中的第 5:7 列)的平均值。接下来,我想根据每只动物各自对照组的平均值来标准化(除以)每个数字端点(第 5:7 列)。

换句话说,num1 对于所有动物,其中 drug == "A" 应该除以 num1 对于所有动物,其中drug == "A" AND dose == 0 对于每个端点,依此类推。

最终输出应与原始 data.frame 大小相同,所有非数字元数据列在左侧保持不变,所有数字数据列现在都具有标准化值.

当然,我希望找到最简单的解决方案 - 最大限度地减少新变量的创建,并且如果可能的话最好在单个 dplyr 管道中。

到目前为止我尝试过的内容

我应该说我已经从技术上解决了这个问题,但该解决方案非常丑陋,需要大量步骤,因此我希望获得帮助以找到更优雅的解决方案。

我知道我可以使用以下方法轻松地将对照组的平均值放入新的data.frame中:

df %>% 
  filter(dose == 0) %>%
  group_by(drug, dose) %>%
  summarise_all(mean) 

我研究了几件事,但不知道如何实现它们。按照我认为最有希望的顺序:

  1. dplyr::group_modify()
  2. dplyr::rowwise()
  3. sweep() 在某种类型的循环中

预先感谢您提供的任何帮助!

最佳答案

如果目的是将数字列除以 mean对照组值,按“药物”分组,按“药物”分组后,使用 mutateacross (来自 dplyr 1.0.0 ),将列值( . 与“剂量”为 0 的值的 mean 相除

library(dplyr) # 1.0.0
df %>% 
   group_by(drug) %>% 
   mutate(across(where(is.numeric), ~ ./mean(.[dose == 0])))

如果我们有一个 dplyr 版本是 < 1.0.0,使用mutate_if

df %>%
    group_by(drug) %>%
    mutate_if(is.numeric, ~ ./mean(.[dose == 0]))

关于r - 通过控制组将整个数据帧划分为几个子组中的每一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62685748/

相关文章:

r - 使用大型数据集制作嵌套列表的最佳方法是什么?右

r - 使用 R 在 postgres 中设置模式名称

r - 函数按字面意思接受参数而不是参数的值

r - dplyr : summarise a variable given as a character string 中的标准评估

json - 将 R 作为带有参数的 Web 服务调用并加载 JSON?

r - 有没有办法在绘图热图的右侧移动行标签?

r - 如何加速 `dplyr::mutate()` 中的空间操作?

r - 使用 R 管道时,没有适用于 'tbl_vars' 应用于类 "c(' fseq', 'function' ) 的对象的方法

r - 将字符串转换为符号,然后转换为 !! 识别的 quosure在整洁的宇宙中

R dplyr : group by without aggregate function