起始数据
我正在 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)
我研究了几件事,但不知道如何实现它们。按照我认为最有希望的顺序:
dplyr::group_modify()
dplyr::rowwise()
sweep()
在某种类型的循环中
预先感谢您提供的任何帮助!
最佳答案
如果目的是将数字列除以 mean
对照组值,按“药物”分组,按“药物”分组后,使用 mutate
与 across
(来自 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/