我正在尝试应用我在这里找到的解决方案来生成机器学习模型:
这是一个虚拟数据集:
data_pred <- data.frame(x1 = 1:10, x2 = 11:20, x3 = 21:30)
data_resp <- data.frame(y1 = c(1:5, NA, 7:10), y2 = c(NA, 2, NA, 4:10))
这是我的 for()
data_pred
中预测变量建模的循环方法在 data_resp
中测量的响应的每一列上使用caret
封装:
# data_pred contains predictors
# data_resp contains one column per measurement
# 1 matching row per observation in both data_pred and data_resp
for (i in 1:ncol(data_resp)) {
train(x = data_pred[!is.na(data_resp[, i]), ],
y = data_resp[!is.na(data_resp[, i], i],
... )
}
现在我正在尝试对 lapply
做同样的事情,我认为它有很多优点。我在翻译 !is.na()
时遇到问题动态标准,以便我只对每个响应的非 NA 案例进行建模。这是我测试 lapply
的初始函数方法:
rf_func <- function(y) {
train(x = data_pred,
y = y,
method = "rf",
tuneGrid = data.frame(.mtry = 3:6),
nodesize = 3,
ntrees = 500,
trControl = trControl) }
然后创建一个空列表来存储结果并将函数应用于 data_resp
:
models <- list(NULL)
models$rf <- lapply(as.list(data_resp), rf_func)
自 randomForest
起一切正常可以处理NA
s,但其他方法不能,所以我需要从每个 data_resp
中删除这些行元素以及我的预测变量中的相应行。
我尝试过但没有成功:
train(x = data_pred_scale[!is.na(y), ],
y = y[!is.na(y)],
... }
我也尝试过y[[!is.na(y)]]
如何将 data.frame 方法 ( df[!is.na(df2), ]
) 转换为 lapply
?
最佳答案
有几种不同的方法。一个简单的方法是使用匿名函数:
lapply(data_resp, function(x) rf_func(x[!is.na(x)]))
关于r - 使用 lapply 和 !is.na 对 R 中的列表向量进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799158/