如何编写高效的代码以导入多个SAS文件

时间:2019-03-18 05:59:25

标签: r

我正在努力创建用于导入SAS数据文件的有效代码。

我的代码如下:

library(foreign)
library(haven)
f <- file.path(path = "E:/Cohortdata/Raw cohort/Nationalscreeningcohort/01.jk", 
               c("nhis_heals_jk_2002.sas7bdat","nhis_heals_jk_2003.sas7bdat" ,"nhis_heals_jk_2004.sas7bdat",
                 "nhis_heals_jk_2005.sas7bdat","nhis_heals_jk_2006.sas7bdat","nhis_heals_jk_2007.sas7bdat",
                 "nhis_heals_jk_2008.sas7bdat","nhis_heals_jk_2009.sas7bdat","nhis_heals_jk_2010.sas7bdat",       "nhis_heals_jk_2011.sas7bdat","nhis_heals_jk_2012.sas7bdat","nhis_heals_jk_2013.sas7bdat"))
d <- lapply (f, read_sas)

我知道用for循环重写会更有效,但是不知道代码的样子

如果您能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:2)

这是我发布的here代码的一种变体,但是您也可以将其用于SAS文件。

请注意,我使用file.path()而不是使用list.files()。这样一来,我就可以读取路径"E:/Cohortdata/Raw cohort/Nationalscreeningcohort"中的所有文件,该位置是我假设您的文件所在的位置。另外,我使用参数pattern仅查找sas7bdat文件。

list.files()返回一个向量,您可以在此处使用所需的*apply方法。但是,我喜欢将vector更改为tbl_df,并喜欢使用tidyverse方法。这意味着使用purrr::map()tidyverse的一部分)读取所有文件,并为所有文件创建大数据tbl_df

library(tidyverse)
library(foreign)
library(haven)

df <- list.files(path = "E:/Cohortdata/Raw cohort/Nationalscreeningcohort",
                 full.names = TRUE,
                 recursive = TRUE,
                 pattern = "*.sas7bdat") %>% 
  tbl_df() %>%
  mutate(data = map(value, read_sas)) %>%
  unnest(data)