【发布时间】:2019-03-24 15:39:56
【问题描述】:
我在尝试将自定义函数应用于数据框中的多个组并将其更改为原始数据时遇到问题。我正在尝试计算每行数据的抑制百分比(实验中的每个观察值都有一个值)。具有挑战性的问题是该函数需要两组不同值(阳性和阴性对照)的平均值,然后在每次计算中使用该平均值。
换句话说,阴性对照的平均值减去实验值,然后除以阴性对照的平均值减去阳性对照。
每个观察值(包括 + 和 - 对照)都应该计算出抑制百分比,并且作为双重检查,对于每个实验(分组) - 控制的 pct inhib 的平均值应该在 0 左右,+ 控制在 100 左右。
功能:
percent_inhibition <- function(uninhibited, inhibited, unknown){
uninhibited <- as.vector(uninhibited)
inhibited <- as.vector(inhibited)
unknown <- as.vector(unknown)
mu_u <- mean(uninhibited, na.rm = TRUE)
mu_i <- mean(inhibited, na.rm = TRUE)
percent_inhibition <- (mu_u - unknown)/(mu_u - mu_i)*100
return(percent_inhibition)
}
我有一个包含多个变量的数据框:目标、框、复制和样本类型。我可以通过对数据进行子集(如下)、(1 个目标、框和复制)来进行计算,但无法找出将其应用于所有数据的正确方法。
subset <- data %>%
filter(target == "A", box == "1", replicate == 1)
uninhib <-
subset$value[subset$sample == "unihib"]
inhib <-
subset$value[subset$sample == "inhib"]
pct <- subset %>%
mutate(pct = percent_inhibition(uninhib, inhib, .$value))
我已经尝试过 group_by 和 do,以及嵌套函数,但是我缺乏如何将这些函数应用于我的子集问题的知识。当涉及到子集的子集(计算均值)然后将其应用于各个值时,我被卡住了。我希望有一种优雅的方法可以在没有所有子集的情况下做到这一点,但我不知道如何做。
我试过了:
inhibition <- data %>%
group_by(target, box, replicate) %>%
mutate(pct = (percent_inhibition(.$value[.$sample == "uninhib"], .$value[.$sample == "inhib"], .$value)))
但由于 group_by 函数,会出现列长度不正确的错误。
【问题讨论】:
-
它可能适用于所有删除的
.$。那是因为例如.$value指的是整个列,而value在分组数据框的上下文中,指的是每个组对应的列的子集 -
没有 .$ 也可以。这帮助很大!