R循环通过组和列并将数据输出到帧中

时间:2018-02-01 00:58:32

标签: r function loops dplyr

我正在尝试按组创建循环以节省我必须在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)
  }

任何建议都将不胜感激!

1 个答案:

答案 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)