使用 R 中的 apply 系列将 2 列数据帧的每一行传递给我创建的函数?



我有一个包含两列的小数据帧: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)
}

fpfn代表他们在df年所做的同样的事情。在这个函数中,bayesrule,我为.03baserate留下了一个默认值。我的问题是:我怎样才能编写一些R代码——我猜可能使用apply系列函数,但也许是别的什么——将df的值中的每一行传递给fpfn到它们在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一次)。

相关内容

  • 没有找到相关文章

最新更新