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

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

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

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

感谢大家。

这是我所拥有的:

# 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
  • 关于第二部分,循环本质上是顺序的,所以不清楚你所说的“同时”是什么意思。你想要没有循环的并行执行吗?还是没有循环的向量化执行?

标签: r function csv


【解决方案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 文件,同时保留旧版本。您可以更新您的帖子以显示一些文件吗?也许我提供的正则表达式与您目录中的文件名存在问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2019-12-12
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多