我在尝试将自定义函数应用于数据框内的多个组并将其变异为原始数据时遇到麻烦。我正在尝试计算每一行数据的抑制百分比(实验中的每个观察都有一个值)。具有挑战性的问题是该函数需要两组不同值的平均值(阳性和阴性对照),然后在每次计算中使用该平均值。
换句话说,将阴性对照的平均值减去实验值,然后除以阴性对照的平均值减去阳性对照。
对于每个实验(分组),包括+和-控件在内的每个观察值均应具有计算出的抑制百分比,并应仔细检查 -控件的pct抑制的均值应约为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函数,出现列长度不正确的错误。
答案 0 :(得分:1)
library(tidyr)
library(purrr)
library(dplyr)
data %>%
group_by(target, box, replicate) %>%
mutate(pct = {
x <- split(value, sample)
percent_inhibition(x$uninhib, x$inhib, value)
})
#> # A tibble: 10,000 x 6
#> # Groups: target, box, replicate [27]
#> target box replicate sample value pct
#> <chr> <chr> <int> <chr> <dbl> <dbl>
#> 1 A 1 3 inhib -0.836 1941.
#> 2 C 1 1 uninhib -0.221 -281.
#> 3 B 3 2 inhib -2.10 1547.
#> 4 C 1 1 uninhib -1.67 -3081.
#> 5 C 1 3 inhib -1.10 -1017.
#> 6 A 2 1 inhib -1.67 906.
#> 7 B 3 1 uninhib -0.0495 -57.3
#> 8 C 3 2 inhib 1.56 5469.
#> 9 B 3 2 uninhib -0.405 321.
#> 10 B 1 2 inhib 0.786 -3471.
#> # … with 9,990 more rows
由reprex package(v0.2.1)于2019-03-25创建
或者:
data %>%
group_by(target, box, replicate) %>%
mutate(pct = percent_inhibition(value[sample == "uninhib"],
value[sample == "inhib"], value))
data
为:
n <- 10000L
set.seed(123) ; data <-
tibble(
target = sample(LETTERS[1:3], n, replace = TRUE),
box = sample(as.character(1:3), n, replace = TRUE),
replicate = sample(1:3, n, replace = TRUE),
sample = sample(c("inhib", "uninhib"), n, replace = TRUE),
value = rnorm(n)
)