r - 如何在多个数据帧上运行相同的代码?
问题描述
我有一个从文件夹导入的数据框列表,我想编写一个函数,该函数将根据数据框的标题(取自文件名)更改一些值。
library(dplyr)
time_geog <- function(index) {
index = index %>%
mutate(Quarter = quarter(as.Date(quarter_date, format = "%d/%m/%Y"),
with_year = TRUE),
Quarter = paste0(substr(as.character(Quarter), 1, 4),"Q",
substr(as.character(Quarter), 6, 6)),
QuarterQF = case_when(Quarter == "2018Q4" ~ "p",
TRUE ~ ""))
if(str_detect(index, "Title")) {
index = index %>%
mutate(var1 = case_when(var1 == "abcd" ~ "code",
TRUE ~ var1),
var2 = case_when(var2 == "abcd" ~ "code",
TRUE ~ var2),
QF1 = case_when(var1 %in% c("value1", "value2") ~ "x",
TRUE ~ ""),
QF2 = case_when(var2 %in% c("value1", "value2") ~ "x",
TRUE ~ ""))
} else {
index = index %>%
mutate(var3 = case_when(var3 == "abcd" ~ "code",
TRUE ~ var3),
var4 = case_when(var4 == "abcd" ~ "code",
TRUE ~ var4),
QF1 = case_when(var3 == "value1" ~ "d", TRUE ~ "",
var3 %in% c("value2", "value3") ~ "x",
TRUE ~ ""))
}
}
我已将此函数放入一个 for 循环中,如下所示,它还读取我需要的所有文件并根据它们的原始名称为其分配一个名称。
for (i in names) {
filepath <- file.path(files, paste0(i, ".csv"))
assign(substr(i, 10, nchar(i)), read_csv(filepath))
time_geog(get(substr(i, 10, nchar(i))))
}
它在我将特定文件传递给它时起作用,但在我运行循环时不起作用。我也没有问题阅读我需要的文件和我需要的标题。之后我也不希望它们都在同一个数据框中,如果我使用会发生这种情况:
for (i in names) {
filepath <- file.path(files, paste0(i, ".csv"))
assign(substr(i, 10, nchar(i)), read_csv(filepath))
i <- time_geog(get(substr(i, 10, nchar(i))))
}
任何帮助将非常感激。我觉得我真的很接近,但只是错过了一些重要的知识!
解决方案
永远记住一次操作多个数据帧的正确方法是将它们存储到一个列表中,然后使用lapply
或其他映射函数一次将您的函数应用于列表。
我没有您的数据,但根据您提供的代码,您可以尝试:
# create an empty list (you may want to specify the length of the list if you know the total number of your files)
df_list <- list()
# store all dataframe into the list
for (i in names) {
filepath <- file.path(files, paste0(i, ".csv"))
df_list[[length(df_list)+1]] <- read_csv(filepath)
}
# apply your function to the list
df_list_new <- lapply(df_list,time_geog)
# merge the list into one master dataframe (`bind_rows()` comes from `dplyr` package)
df_master <- bind_rows(df_list_new)
推荐阅读
- java - Spring通过外部工厂自动创建通用bean
- c# - 将元素更新/添加到 MVVM 集合列表后,UWP 列表视图不更新
- c++11 - 检测 NVCC 中是否启用了 c++11
- linux - 查询已终止但等待加入的应用程序线程的正确命令是什么?
- c# - 查找包含在任意旋转矩形中的网格单元的算法(光栅化)
- jhipster - “jhipster gae”部署后端,但不部署 Angular 端
- mysql - 对大型 MySQL InnoDB 表进行分区的方法
- c++ - CMake find_package 与 GLEW
- azure-api-management - 如何在 Azure API 管理策略中引发错误?
- javascript - 在 1 行中创建具有 2 个不同数据的嵌套表