我正在尝试按组创建循环以节省我必须在mctest中测试所有变量以获取大数据集的多重性。举个例子:
library(mctest)
library(AER)
library(dplyr)
iris <- datasets::iris
iris$stem <- sample(150, size = nrow(iris))
iris$lifespan <- sample(150, size=nrow(iris))
vif_results <- data.frame()
iris_setosa <- iris[which(iris$Species == "setosa"),]
i6 <- imcdiag(iris_setosa[,c(1:4)],iris_setosa[,6]) ## works
i7 <- imcdiag(iris_setosa[,c(1:4)],iris_setosa[,7]) ## works
##copy to df
i6_res <- data.frame(i6$idiags)
i6_res$group <- "setosa"
i6_res$Out <- "stem"
i7_res <- data.frame(i7$idiags)
i7_res$group <- "setosa"
i7_res$Out <- "life"
vif_results <- rbind(i6_res,i7_res)
##Rather than doing the above manually by Species and columns, write a loop to iterate through groups and columns
for(col in 1:ncol(iris[,c(6:7)])){
require(dplyr)
iris1 <- iris %>%
group_by(Species) %>%
do(imcdiag(iris[,c(1:4)],iris[,col]))
print(iris1)
}
f1 <- function(x){
require(dplyr)
iris1 <- iris %>%
group_by(Species) %>%
do(imcdiag(iris[,c(1:4)],iris[,x]))
return(f1)
}
for(col in 1:ncol(iris[,c(6:7)])){print(f1)}
我尝试过各种格式的循环不起作用。谢谢!
编辑我一直在玩这个并且已经能够在循环中构建数据框(我知道这不是首选)。我仍然无法让第二个循环工作以通过y值运行列,所以我复制了&amp;编辑以显示我正在尝试用第二个y值编码。
for (i in seq_along(species)) {
all <- subset(iris, iris$Species == species[i])
## This is the part I wanted to create another loop for so that I don’t have to list a lot of y-variables for bigger datasets
y6 <- imcdiag(all[,1:4],all[,6])
## This section works nicely to append all the vif values into a single table for easy analysis and export.
vifs6 <- as.data.frame(y6$idiags)
vifs6$Iteration <- i
vifs6$Species <- species[[i]]
vifs6$Output <- paste0(colnames(iris[6]))
vif_results <- rbind(vif_results,vifs6)
print(y6)
y7 <- imcdiag(all[,1:4],all[,7])
vifs7 <- as.data.frame(y7$idiags)
vifs7$Iteration <- i
vifs7$Species <- species[[i]]
vifs7$Output <- paste0(colnames(iris[7]))
vif_results <- rbind(vif_results,vifs7)
print(y7)
}
任何建议都将不胜感激!
答案 0 :(得分:0)
使用apply
,您可以获得所需的输出,这是一个包含所有感兴趣的组和列组合结果的数据框。
我们将使用iris
数据框和两个额外的列,如您的问题
首先,我们使用expand.grid
创建一个包含所有感兴趣的组合或组和列的数据框。
combinations <- expand.grid(names(iris[, 6:7]), unique(as.character(iris[["Species"]])))
结果如下:
Var1 Var2
1 stem setosa
2 lifespan setosa
3 stem versicolor
4 lifespan versicolor
5 stem virginica
6 lifespan virginica
我们在第一列中有列名,在第二列中有组名,因此每行代表一对名称。
有了这个,我们可以使用apply
循环遍历每一对。
results_list <- apply(combinations, 1, function(each_pair) {
# An iris subset
this_iris <- iris[which(iris$Species == each_pair[2]),]
# Results for that iris subset and one of the columns
result <- imcdiag(this_iris[,c(1:4)], this_iris[each_pair[1]])
# Extract idiags as a data frame
result_df <- as.data.frame(result$idiags)
# Add columns with names for the group, column and variables
result_df[["column"]] <- each_pair[1]
result_df[["group"]] <- each_pair[2]
result_df[["variable"]] <- rownames(result_df)
result_df
})
我们最终得到了一个数据框列表。我们可以使用do.call
将它们绑定在一起。
iris_idiags <- do.call(args = results_list, what = rbind)