动态使用导入的 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 函数的主要内容,如果未能解决你的问题,请参考以下文章