将数据帧作为csv保存在函数中,而不是通过列表(iwalk?)静默保存]]

问题描述 投票:1回答:1

我正在从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_3df_4df_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文件,因为我一直默默进行。我在这个主题上遇到的大多数问题...

r csv lapply purrr
1个回答
1
投票

我认为您的想法和方法是正确的。将函数中的一行更改为:

© www.soinside.com 2019 - 2024. All rights reserved.