【问题标题】:How to read in datasets from multiple directories and merge all datasets in each directory in R?如何从多个目录中读取数据集并合并R中每个目录中的所有数据集?
【发布时间】:2021-02-24 19:22:09
【问题描述】:

我正在尝试从不同目录中读取多个数据文件,并且我想合并每个目录中的所有文件并将它们列出到环境中。我正在处理的数据是 NHANES。

例如,如果只对 NHANES 1999-2000 这样做。

  nhanes_names <- dir(here("data","raw", "NHANES","1999-2000"))
  nhanes_directory <- here("data","raw", "NHANES", "1999-2000", nhanes_names)
  
  nhanes_1999to2000<-nhanes_directory %>%
    set_names(nhanes_names) %>%
    map(read_rds) %>%
    reduce(full_join, by = "seqn")

我想知道是否有一种简洁的方法可以使用 purrr 将代码应用于所有文件夹(1999-2000、2001-2002、...、2013-2014)。

【问题讨论】:

  • 谢谢,我确实阅读了其中的内容。但我仍在寻找一种更整洁的方法来做到这一点。目前,我使用 for 循环来解决问题,但也许有更好的方法。再次感谢!

标签: r tidyverse


【解决方案1】:

你可以符合以下条件:

library(purrr)
library(here)
library(readr)
library(dplyr)

list.files(here("data","raw", "NHANES"), 
           recursive = TRUE, full.names = TRUE) %>% ## get all files
   grep("\\.rds$", ., value = TRUE) %>%             ## reduce to rds files
   map(read_rds) %>%                                ## read in each
   reduce(full_join, by = "seqn")                   ## and merge them

返回列表中每个目录的合并文件:

library(purrr)
library(here)
library(readr)
library(dplyr)

list.dirs(here("data","raw", "NHANES"), recursive = FALSE) %>% ## get all subdirs 
  map(function(sdir) {                                         ## map over all subdirs
      fns <- list.files(sdir, "\\.rds$", full.names = TRUE)    ## get all files in sdir
      map(fns, read_rds) %>%                                   ## read each
          reduce(full_join, by = "seqn")                       ## and merge them
  })

【讨论】:

  • 感谢您的回答!该代码有效,但它会生成许多具有相同名称但带有后缀的变量,例如variable.x,variable.y。我想先合并每个目录中的数据集(也就是说,如果我有 9 个不同的目录,我会有 9 个不同的合并数据集),然后我可以将它们列出到环境中,稍后再合并。
  • 非常感谢您的回答!效果很好!
猜你喜欢
  • 2013-02-04
  • 2021-08-20
  • 2021-06-25
  • 2020-05-03
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多