#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
= ""
что .