【问题标题】:for loops nested in R嵌套在 R 中的 for 循环
【发布时间】:2020-12-06 04:44:22
【问题描述】:

我有一个数据集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 数据集,但我不知道如何返回列表并继续循环以获取mtcars_new_1 等等。我有很多数据集,不知道应该循环嵌套数据多少次。

mtcars_new <- data.frame()

for(i in 1:nrow(dt)){
  if(dt$data_source[[i]] %in% names(dt_list) && !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]
}
}

【问题讨论】:

    标签: r loops repeat


    【解决方案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
      
    }
    

    【讨论】:

    • 当您检查which(dt$data_source[[i]] == names(available_data_sets)) 时,它返回mtcarsiris 0 行,因为dt$variable = ""
    猜你喜欢
    • 2023-03-02
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 2019-01-10
    • 2021-08-19
    • 2021-08-09
    • 2021-09-15
    • 2019-05-21
    相关资源
    最近更新 更多