如何从 R 列表中的数据框列创建新对象并将其用于 R 中的建模?

How to create new object from columns of dataframe in list in R and use this for modeling in R?

我有一个包含 10 个数据帧的列表,称为“datalist”,我想在其上应用多个函数。我是 R 的新手。我在互联网上搜索但找不到合适的解决方案。

数据帧都有相同的变量,如下面的简化示例:

ID FID WETLAND TPI200 TPI350 TPI500 ...
1  1   no wetl 52     35     20     ...
2  2   wetl    21     19     19     ...
... 

目标是使用此数据为每个数据帧执行 PLS-DA 模型。因此,我想首先为每个数据帧创建一个由第 4 列到第 8 列的变量值组成的 X 轴和一个由第 3 列 ("WETLAND") 组成的 Y 轴。 但是我如何为每个数据帧执行此操作? for loops 是否可以为 10 个数据帧创建 X1、X2... 和 Y1、Y2... 轴?或者我应该使用 lapply?

其次,我想使用为每个数据帧创建的 X 轴和 Y 轴为每个数据帧创建一个 PLS-DA 模型。我可以使用以下代码为一个数据帧执行此操作,但如何将其应用于列表中的每个数据帧?

library(mixOmics)

model.splsda<-splsda(X,Y,keepX = c(5,5)) 
model.splsda$loadings

您可以编写自定义模型拟合函数来对 data.frames select 感兴趣的列和 运行 建模函数进行子集化。
lapply 数据列表的自定义函数和 select 使用 *apply 循环从此输出列表加载。

library(mixOmics)

custom_splsda <- function(data, ncomp, keepX, ..., Xcols, Ycol){
  Y <- data[[Ycol]]
  X <- data[Xcols]
  res <- splsda(X, Y, ncomp = ncomp, keepX = keepX, ...)
  res
}

model_list <- lapply(datalist, custom_splsda, ncomp = 2, keepX = c(5, 5), Xcols = 4:8, Ycol = "WETLAND")
loadings_list <- lapply(model_list, '[[', 'loadings')

loadings_list[[1]]
#$X
#         comp 1     comp 2
#1401 -0.7929405 -0.2459434
#1141 -0.3835902 -0.2429583
#563   0.2417486  0.1065414
#1257  0.3608328 -0.8967159
#509  -0.1883114 -0.2550150
#
#$Y
#       comp 1     comp 2
#AF  0.7071068 -0.7071068
#BE -0.7071068  0.7071068

数据

数据来自 help('splsda') 中的第一个示例,重复以创建包含多个数据集的列表。

## First example
data(breast.tumors)
X <- breast.tumors$gene.exp
# Y will be transformed as a factor in the function,
# but we set it as a factor to set up the colors.
Y <- as.factor(breast.tumors$sample$treatment)

names(X) <- breast.tumors$genes$name
df1 <- data.frame(WETLAND = Y)
df1 <- cbind(df1, X)
datalist <- list(df1, df1, df1)
names(datalist) <- sprintf("data_%d", 1:3)