如何从 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)
我有一个包含 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)