如何迭代一个参数,对相同的数据应用相同的函数
How to iterate over one argument, applying the same function over the same data
"generateFilterValuesData" 是 "mlr" 包的一个函数,它使用各种算法进行特征选择。我想以迭代的方式对相同的数据应用不同的算法,以检查不同方法选择的不同特征。为此,原则上我应该对相同的数据应用相同的函数,同时改变 "method" 参数(大约 15 个可能的值)。我在这里提供了一个可重现的例子(我没有使用 set.seed() 因为数值本身是不相关的):
feature_A <- rnorm(200, 5, 2)
feature_B <- rnorm(200, 3, 2)
feature_C <- rnorm(200, 3.7, 1.3)
feature_D <- runif(200)
feature_E <- rpois(200, 1.6)
feature_F <- rpois (200, 7.3)
feature_G <- rlogis(200)
feature_H <- rexp(200, 2)
feature_I <- rexp (200, 3)
test_activ <- as.factor(rbinom(200, 1, 0.5))
df <- data.frame(feature_A, feature_B, feature_C, feature_D,
feature_E, feature_F, feature_G, feature_H,
feature_I, test_activ)
library(mlr)
taskg <- makeClassifTask(data = df, target="test_activ")
fv <- generateFilterValuesData(task, method = c("anova.test"))
methods <- c("anova.test", "auc", "cforest.importance","chi.squared", "gain.ratio", "information.gain",
"kruskal.test", "oneR", "permutation.importance",
"randomForest.importance", "randomForestSRC.rfsrc",
"randomForestSRC.var.select", "ranger.impurity",
"ranger.permutation", "relief", "symmetrical.uncertainty",
"univariate.model.score", "variance")
我想在 taskg 任务上迭代应用函数 "generateFilterValuesData",改变方法(即迭代 18 种方法)。我试过 lapply 如下:
lapply (methods, generateFilterValuesData, taskg),
但我收到以下错误:“lapply(methods, generateFilterValuesData, taskg) 中的错误:
断言失败。必须申请以下其中一项:
* checkClass(task): 必须有 class 'ClassifTask',但有 class
* 'character'
* checkClass(task): 必须有class 'RegrTask',但有class 'character'
* checkClass(task): 必须有 class 'SurvTask', 但有 class 'character'"
我意识到我做错了什么,但我无法找到如何对 "methods" 向量执行此迭代(因为此向量包含相同参数的不同值,而不是该功能将被应用)。
我想您可能正在寻找这个(基于您的 fv
作业)。
lapply(methods, function(m) generateFilterValuesData(taskg, method = m))
当你这样做时
lapply (methods, generateFilterValuesData, taskg)
论据正在转换。例如,如果你这样做,你会得到同样的错误
generateFilterValuesData(methods[1], taskg)
"generateFilterValuesData" 是 "mlr" 包的一个函数,它使用各种算法进行特征选择。我想以迭代的方式对相同的数据应用不同的算法,以检查不同方法选择的不同特征。为此,原则上我应该对相同的数据应用相同的函数,同时改变 "method" 参数(大约 15 个可能的值)。我在这里提供了一个可重现的例子(我没有使用 set.seed() 因为数值本身是不相关的):
feature_A <- rnorm(200, 5, 2)
feature_B <- rnorm(200, 3, 2)
feature_C <- rnorm(200, 3.7, 1.3)
feature_D <- runif(200)
feature_E <- rpois(200, 1.6)
feature_F <- rpois (200, 7.3)
feature_G <- rlogis(200)
feature_H <- rexp(200, 2)
feature_I <- rexp (200, 3)
test_activ <- as.factor(rbinom(200, 1, 0.5))
df <- data.frame(feature_A, feature_B, feature_C, feature_D,
feature_E, feature_F, feature_G, feature_H,
feature_I, test_activ)
library(mlr)
taskg <- makeClassifTask(data = df, target="test_activ")
fv <- generateFilterValuesData(task, method = c("anova.test"))
methods <- c("anova.test", "auc", "cforest.importance","chi.squared", "gain.ratio", "information.gain",
"kruskal.test", "oneR", "permutation.importance",
"randomForest.importance", "randomForestSRC.rfsrc",
"randomForestSRC.var.select", "ranger.impurity",
"ranger.permutation", "relief", "symmetrical.uncertainty",
"univariate.model.score", "variance")
我想在 taskg 任务上迭代应用函数 "generateFilterValuesData",改变方法(即迭代 18 种方法)。我试过 lapply 如下:
lapply (methods, generateFilterValuesData, taskg),
但我收到以下错误:“lapply(methods, generateFilterValuesData, taskg) 中的错误: 断言失败。必须申请以下其中一项: * checkClass(task): 必须有 class 'ClassifTask',但有 class * 'character' * checkClass(task): 必须有class 'RegrTask',但有class 'character' * checkClass(task): 必须有 class 'SurvTask', 但有 class 'character'"
我意识到我做错了什么,但我无法找到如何对 "methods" 向量执行此迭代(因为此向量包含相同参数的不同值,而不是该功能将被应用)。
我想您可能正在寻找这个(基于您的 fv
作业)。
lapply(methods, function(m) generateFilterValuesData(taskg, method = m))
当你这样做时
lapply (methods, generateFilterValuesData, taskg)
论据正在转换。例如,如果你这样做,你会得到同样的错误
generateFilterValuesData(methods[1], taskg)