r - 将函数应用于所有数据框
问题描述
我使用 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很陌生,如果有人可以帮助我,非常感谢。
解决方案
您可能想考虑使用不同的数据结构,例如,您可以使用命名列表来保存数据帧,然后您可以轻松地循环它们。
事实上,你可以在一个循环中完成所有事情,我相信有一种更有效的方法可以做到这一点,但这里有一个例子,说明了一种无需过多更改代码的方法:
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)
}
推荐阅读
- java - 为什么我的 ProcessBuilder inputStream 产生的数据与来自 linux 命令行的数据不同
- bash - 如何编写一个函数来处理与正则表达式匹配的任何命令?
- javascript - 生成 N 种颜色的调色板 - 尽可能独特且相距较远,以便在图表中使用
- python - 每次调用python脚本时如何避免重新加载ML模型?
- firebase - 在 UI Firebase Auth Flutter 中显示异常错误
- python - 使用 python madlibs 程序自动化无聊的东西
- r - 具有多个 bin 和组的直方图
- google-cloud-firestore - Firestore:我们不能在使用 whereIn 过滤的字段上使用 orderBy 吗?
- javascript - 使用 HttpClient 和 Angular 将表单发布到 FormSubmit
- python - 如何检测玩家和方块之间的碰撞?游戏