动态使用导入的 csv 文件名导出 csv 的 R 函数

Posted

技术标签:

【中文标题】动态使用导入的 csv 文件名导出 csv 的 R 函数【英文标题】:R function that uses the imported csv filename for exported csv, dynamically 【发布时间】:2021-12-31 13:11:06 【问题描述】:

我正在尝试编写一个导入 .csv 文件的 R 函数,对其进行一些修改(此处删除空列)并将修改后的数据框导出为新的 .csv 文件。我有两个问题:

    我希望函数使用“primary.csv”文件的名称并向其添加“modified”,以便导出的 .csv 文件类似于“primary_modified.csv”

    我希望该函数作为一个循环工作,这样我就可以同时为多个数据帧运行它,而不是一个一个地运行。

感谢大家。

这是我所拥有的:

# create a function to remove all empty columns and save and write a new csv
removeEmptyCol <- function(x)
   df <- read.csv(x)
   colSums(is.na(df) | df == "")
   empty_columns <- colSums(is.na(df) | df == "") == nrow(df)
   df <- df[, !empty_columns]
   df[is.na(df)] <- ""
# need to change the file name for each dataframe 
   write.csv(df, "Trimmed-1.csv")

【问题讨论】:

第一部分的问题很简单。您只需使用正则表达式来替换文件名。比如:new_filename 关于第二部分,循环本质上是顺序的,所以不清楚你所说的“同时”是什么意思。你想要没有循环的并行执行吗?还是没有循环的向量化执行? 【参考方案1】:

因为您没有提及其他地方的并行处理,我将您的问题解释为需要一个 for 循环来导入 .csv 文件,执行一个或多个操作,然后在导入另一个 .csv 文件并执行之前导出文件同一系列操作。

这是一个使用 tidyverse 的解决方案:

library(tidyverse)
  
remove_empty_col <- function (dir) 
  files <- list.files(path = dir, pattern = "*.csv", full.names = TRUE)
  
  for (file in files) 
    
    new_name <- str_replace(file, "\\.csv$", "_modified.csv") 
    
    df <- read_csv(file)
    
    df <- df %>%
       select_if(~!(all(is.na(.)) | all(. == "")))
    
    write_csv(df, paste0(new_name)) 
  


out <- remove_empty_col("/dir/path/to/data/sets")

【讨论】:

感谢您的快速回复。该代码运行并适用于修改部分,但它不会更改 csv 文件名。有什么建议吗? 它使用该名称导出一个新的、已清理的文件。在您的目录中应该有旧版本的文件,例如“myfile.csv”和新版本,例如“myfile_modified.csv”。您是否要覆盖旧文件?您确定要销毁数据吗? 对我来说它只是覆盖了现有的同名文件!它可能与 r 版本或类似的东西有关? 嗯。我肯定会导出带有 _modified 的 .csv 文件,同时保留旧版本。您可以更新您的帖子以显示一些文件吗?也许我提供的正则表达式与您目录中的文件名存在问题?

以上是关于动态使用导入的 csv 文件名导出 csv 的 R 函数的主要内容,如果未能解决你的问题,请参考以下文章

R语言read csv导入后,数据变了

mysql中csv文件的导入导出

php中如何导入导出CSV格式的文件

mysql导入导出CSV

php 导入/导出 csv 文件

动态构建大型数据框(spark 或 pandas)以导出到 csv 的方法