r - 使用 lapply 和 !is.na 对 R 中的列表向量进行子集化

标签 r subset lapply na

我正在尝试应用我在这里找到的解决方案来生成机器学习模型:

这是一个虚拟数据集:

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/

相关文章:

r - 根据 R 数据帧中的多个条件循环或应用行总和

在 R 中将 for 循环重写为 lapply 函数

r - 为什么重复调用 lapply 后闭包中的变量值会丢失?

r - 如何使用ggplot2在 map 上添加经度和纬度线?

r - 对满足条件的多个列进行子集化

r - R - S 和 F 计数中的 bestglm 问题不能 <0

r - 加速 R 中的嵌套应用代码

r - 制作没有 mustache 的箱线图

datetime - 使用哪个 R 时间/日期类和包?

python - 如何在 R 中迭代时动态修改向量