簡體   English   中英

R遍歷組和列並將數據輸出到幀中

[英]R Loop through group and column and output data into frame

我試圖按組創建一個循環,以免我不得不在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值的列,因此我已經復制並編輯以顯示我要使用第二個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) } 

任何建議將不勝感激!

通過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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM