我有一个包含两列的小数据帧:fp
(误报)和fn
(假阴性),如下所示:
falsepos <- c(.05, .25, .5)
falseneg <- c(.01, .05, .1)
x_name <- "fp"
y_name <- "fn"
df <- data.frame(falsepos,falseneg)
names(df) <- c(x_name, y_name)
我还写了一些贝叶斯规则作为函数的改编,如下所示:
bayesrule <- function(baserate = .03,
fp,
fn) {
output <- (baserate * (1 - fn)) / ((baserate * (1 - fn)) + ((1 - baserate) * (fp)))
return(output)
}
fp
和fn
代表他们在df
年所做的同样的事情。在这个函数中,bayesrule
,我为.03
的baserate
留下了一个默认值。我的问题是:我怎样才能编写一些R
代码——我猜可能使用apply
系列函数,但也许是别的什么——将df
的值中的每一行传递给fp
并fn
到它们在bayesrule
函数中的相应位置,给我三个贝叶斯规则计算(每个计算的默认baserate
相同 .03)?
我在SX中查看过类似的帖子,并且已经非常接近,但我只是对此感到羞涩。我已经接近了:
sapply(df,FUN = bayesrule,fn=df$fn, fp=df$fp)
但没有更近。
通常,如果函数没有矢量化并且依赖于长度> 1 的多个参数,我们可以使用Map
/mapply
unlist(Map(bayesrule, fn = df$fn, fp = df$fp))
或者Vectorize
函数并应用列
Vectorize(bayesrule)(fn = df$fn, fp = df$fp)
#[1] 0.37979540 0.10516605 0.05273438
在这里,函数已经矢量化,因为函数中显示的操作是R
中的矢量化操作(注释 -@r2evans 注释中也提到了)。 所以,可以直接应用
with(df, bayesrule(fp=fp, fn = fn))
#[1] 0.37979540 0.10516605 0.05273438
或者用dplyr
library(dplyr)
df %>%
mutate(new = bayesrule(fp = fp, fn = fn))
使用sapply
,它单独遍历每一列
您不需要在此处按行执行任何操作:
bayesrule(fp=df$fp, fn=df$fn)
# [1] 0.37979540 0.10516605 0.05273438
由于内部的所有数学都已经为 R 的矢量化效率做好了准备,因此您可以传递向量。它将比尝试每行调用一次更有效(调用bayesrule
一次)。