для циклов, вложенных в R

#r #loops #repeat

#r #циклы #повторите

Вопрос:

У меня есть набор dt данных, в нем хранятся имена наборов данных списка, мне нужно использовать их для создания нескольких новых наборов данных с выбором некоторых переменных, затем я использую только что созданный набор данных, повторяю тот же процесс…..

Первая строка и вторая строка были доступными данными. Затем используйте доступные данные для создания новых данных. Затем используйте data just create для создания новых данных

Конечным результатом был список наборов данных

Я оценил любую помощь или предложения.

 dt <- data.frame(name = c("mtcars","iris", "mtcars_new","mtcars_new_1"),
                 data_source = c("mtcars","iris", "mtcars","mtcars_new"),
                 variable = c("","","mpg,cyl,am,hp","mpg,cyl"), stringsAsFactors = FALSE)

> dt
          name data_source      variable
1       mtcars      mtcars              
2         iris        iris              
3   mtcars_new      mtcars mpg,cyl,am,hp
4 mtcars_new_1  mtcars_new       mpg,cyl


dt_list <- list(mtcars, iris)
names(dt_list ) <- c("mtcars","iris")


# The final list of datasets
final_dt <- list(mtcars, iris,  mtcars_new, mtcars_new_1)

 

До сих пор, если я писал подобный цикл, я получал только mtcars_new dataset, но я не знаю, как вернуться к списку и продолжить цикл, чтобы получить mtcars_new_1 и так далее. У меня много наборов данных, и я не знаю, сколько раз я должен перебирать вложенные данные.

 mtcars_new <- data.frame()

for(i in 1:nrow(dt)){
  if(dt$data_source[[i]] %in% names(dt_list) amp;amp; !dt$name[[i]] %in% names(dt_list)){
    check <- eval(parse(text = dt$data_source[[i]]))
    var <- c(unlist(strsplit(dt$variable[[i]],",")))
    mtcars_new <- check[, colnames(check) %in% var]
}
}

 

Ответ №1:

Это приведет к отображению желаемого результата. Поскольку четвертый цикл использует данные, созданные в третьем цикле, вам необходимо иметь способ добавления результатов каждого цикла к растущему списку доступных наборов данных. Затем в каждом цикле найдите, какой из них является правильным начальным набором данных из доступного списка.

 dt <- data.frame(name = c("mtcars","iris", "mtcars_new","mtcars_new_1"),
                 data_source = c("mtcars","iris", "mtcars","mtcars_new"),
                 variable = c("","","mpg,cyl,am,hp","mpg,cyl"), stringsAsFactors = FALSE)

input_data_sets <- list(mtcars, iris)
names(input_data_sets) <- c("mtcars","iris")

final_data_sets <- list()

for(i in 1:nrow(dt)) {
  
  available_data_sets <- c(input_data_sets, final_data_sets)  #Grows a list of all available data sets
  num_to_use <- which(dt$data_source[[i]] == names(available_data_sets)) #finds the right list member to use

  temp <- available_data_sets[num_to_use][[1]]
  var <- c(unlist(strsplit(dt$variable[[i]],",")))
  
  temp <- list(subset(temp, select = var)) #keep only the desired variables
  names(temp) <- dt$name[i] #assign the name provided
  
  final_data_sets <- c(final_data_sets, temp) #add to list of final data sets which will be the output. Anything listed here will become part of the available list in the next loop
  
}
 

Комментарии:

1.Когда вы проверили which(dt$data_source[[i]] == names(available_data_sets)) , он вернулся mtcars и iris с 0 строкой, потому dt$variable = "" что .