我正在从SQL数据库中读取非常大的文件,进行一些数据处理,并尝试将最终版本另存为csv
文件,因为我一直默默进行。我在该主题上遇到的大多数问题都建议先将数据框保存在列表中,然后再像这样单独保存它们,这在一个非常小的示例中适用:
library(tidyverse) SQLlarge <- mtcars SQLlarge2 <- mtcars sql_fun <- function(x) { sql_large_filter <- SQLlarge %>% filter(gear == {{x}}) #other data processing sql_large_filter2 <- SQLlarge2 %>% filter(gear == {{x}}) #other data processing final <- sql_large_filter %>% bind_rows(sql_large_filter2) final } sql_fun(3) temp <- lapply(c(3, 4, 5), sql_fun) names(temp) <- paste0("df_", 3:5) lapply(1:length(temp), function(x) write_csv(temp[[x]], path = paste0("C:\\Users\\", names(temp[x]), ".csv")))
这有效并创建了3个称为
df_3
,df_4
,df_5
的df,但是由于我的文件太大,所以我不想先将它们保存在大列表中,因此我想在每次迭代结束时保存功能结束或无提示保存(iwalk
?)。像这样的东西:
sql_fun2 <- function(x) { sql_large_filter <- SQLlarge %>% filter(gear == {{x}}) #other data processing sql_large_filter2 <- SQLlarge2 %>% filter(gear == {{x}}) #other data processing final <- sql_large_filter %>% bind_rows(sql_large_filter2) arg_name <- deparse(substitute(x)) # Get argument name var_name <- paste("df", arg_name, sep = "_") #assign(var_name, final, env = .GlobalEnv) write_csv(final, path = paste0("C:\\Users\\", var_name, ".csv")) #OR iwalk? # lst(final) %>% # iwalk(., function(df, name) { # write_csv(df, sprintf("C:\\Users\\%s.csv", name)) # }) } sql_fun(3) #works df_3 created but when calling over 3:5: map(3:5, sql_fun2) #returns only one df called "df_.x[[i]].csv"
这只会返回一个名为
df_.x[[i]].csv
的df,所以我在函数内的write_csv
调用中无法正确建立索引?另一个选择是使用iwalk
静默保存它,因此在sql_fun2
中包含以下内容:
lst(final) %>% #not sure how to rename final within dataframe first? iwalk(., function(df, name) { write_csv(df, sprintf("C:\\Users\\%s.csv", name)) })
但是我不确定如何为未分配给全局环境的数据框分配名称(通常我们将数据框重命名为
assign(var_name, final, env = .GlobalEnv)
。
这是正确的方法吗?欢迎任何建议。
谢谢
我正在从SQL数据库中读取非常大的文件,进行一些数据处理,并尝试将最终版本另存为csv文件,因为我一直默默进行。我在这个主题上遇到的大多数问题...
我认为您的想法和方法是正确的。将函数中的一行更改为: