首页 > 解决方案 > 将函数应用于所有数据框

问题描述

我使用 SAS 文件 (sas7bdat = dataframes) 和 SAS 格式 (sas7bcat)。我的 sas7bdat 文件位于“数据”文件中,因此我可以在对象 files_names 中获得一个列表。这是我的代码的第一部分,运行良好

files_names <- list.files(here("data"))
nb_files <- length(files_names)
data_names <- vector("list",length=nb_files)

for (i in 1 : nb_files) {
  data_names[i] <- strsplit(files_names[i], split=".sas7bdat")
}

for (i in 1:nb_files) {
  assign(data_names[[i]], 
         read_sas(paste(here("data", files_names[i])), "formats/formats.sas7bcat")
  )}

但是当我尝试从包的避风港应用函数 as_factor 时遇到了一些问题(为了在我的新数据帧上应用标签并获得像 SEX = "Male" 而不是 SEX = 1)。我可以让它按数据帧工作,如下面的代码

df_labelled <- haven::as_factor(df, only_labelled = TRUE)

我想创建一个循环但没有工作,因为我的 data_names[i] 不是数据框,并且 as_factor 在第一个参数中需要一个数据框。

我对R很陌生,如果有人可以帮助我,非常感谢。

标签: rdataframesas

解决方案


您可能想考虑使用不同的数据结构,例如,您可以使用命名列表来保存数据帧,然后您可以轻松地循环它们。

事实上,你可以在一个循环中完成所有事情,我相信有一种更有效的方法可以做到这一点,但这里有一个例子,说明了一种无需过多更改代码的方法:

files_names <- list.files(here("data"))

raw_dfs <- list()
labelled_dfs <- list()
for (file_name in files_names) {
  # # strsplit returns a list either extract the first element
  # # like this
  # df_name <- (strsplit(file_name, split=".sas7bdat"))[[1]]
  # # or use something else like gsub
  df_name <- gsub(".sas7bdat", '', file_name)
  raw_dfs[df_name] <- read_sas(paste(here("data", file_name)), "formats/formats.sas7bcat")
  labelled_dfs[df_name] <- haven::as_factor(raw_dfs[[df_name]], only_labelled = TRUE)
}

推荐阅读