【问题标题】:R: Doing the same steps on many data frames with their names stored in a vectorR:对许多数据帧执行相同的步骤,并将它们的名称存储在向量中
【发布时间】:2019-11-14 19:59:12
【问题描述】:

我有几个 .RData 文件,每个文件的名称中都有字母和数字,例如。 m22.R 数据。其中每一个都包含一个 data.frame 对象,与文件同名,例如。 m22.RData 包含一个名为“m22”的 data.frame 对象。

我可以使用datanames <- paste0(c("m","n"),seq(1,100)) 之类的内容轻松生成文件名,然后在这些文件上使用 load(),这将给我留下数百个名为 m1、m2 等的 data.frame 对象。我不确定of 是如何进行下一步 - 准备和合并每个数据框,而无需输入所有名称。

我可以创建一个函数,它接受一个数据框作为输入并进行所有处理。但是,如果我将 datanames[22] 作为输入传递给它,我传递的是字符串“m22”,而不是名为 m22 的数据框对象。

我的最终目标是在一堆不同的数据帧上重复执行相同的步骤,而无需手动输入“prepdata(m1) prepdata(m2) ... prepdata(n100)”。我可以想到两种方法,但我不知道如何实现它们:

  • 从数据帧名称的向量中获取包含实际数据帧的列表。
  • 修改我的“prepdata”函数,使其能够接受数据框的名称,但仍然能够以某种方式对数据框本身进行处理(可能通过“分配”的方式) ? 但是函数的最后一步是将准备好的数据合并到更大的数据框中,我不确定是否有使用“分配”的方法可以做到这一点......)

任何人都可以建议如何实施上述方法或其他方式来完成这项工作吗?

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    this answer和对应的R FAQ

    基本上:

    temp1 <- c(1,2,3)
    save(temp1, file = "temp1.RData")
    x <- c()
    x[1] <- load("temp1.RData")
    get(x[1])
    
    #> [1] 1 2 3
    
    

    【讨论】:

    • 谢谢!没有意识到“加载”的结果可以分配给我选择的名称或列表中的位置 - 这让这一切变得更加容易!
    • 为了更正我的其他评论,以防万一以后有人搜索发现这个问题,魔法不在加载(返回对象的 name)它在获取(获取名称并返回数据框)。例如。如果我想将加载的数据框命名为“chunk”,我会执行 varname
    【解决方案2】:

    假设您的所有数据都存在于同一个文件夹中,您可以创建一个包含所有路径的 R 对象,然后您可以创建一个函数来获取 Rdata 文件的路径,读取它并调用“prepdata”。最后,使用purr 包,您可以在输入向量上应用相同的函数。

    这样的事情应该可以工作:

    library(purrr)
    rdata_paths <- list.files(path = "path/to/your/files", full.names = TRUE)
    
    read_rdata <- function(path) {
      data <- load(path)
    
      return(data)
    }
    
    prepdata <- function(data) { 
      ### your prepdata implementation
    } 
    
    master_function <- function(path) {
      data <- read_rdata(path)
      result <- prepdata(data)
    
      return(result)
    
    }
    
    merged_rdatas <- map_df(rdata_paths, master_function) # This create one dataset. Merging all together
    

    【讨论】:

      猜你喜欢
      • 2020-12-20
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-11
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多