【问题标题】:How to delete certain columns in multiple csv files in a Folder?如何删除文件夹中多个 csv 文件中的某些列?
【发布时间】:2023-03-05 07:03:01
【问题描述】:

如何在 R 中导入多个 CSV 文件(15000 个 CSV 文件)并删除每个文件中的某些列并保存?

【问题讨论】:

  • 所有 CSV 文件都有相同的标题
  • 这能回答你的问题吗? How to import multiple .csv files at once?
  • 我找到的最佳代码如下,但每次我收到我的列不存在的相同错误 library("purrr") library("dplyr") file_list % select("-Event") %>% write.table(file_name, sep="\t", col.names=TRUE, row.names=FALSE, quote=FALSE) })

标签: r csv


【解决方案1】:

您可以自动化读取-操作-写入方法。

说,您的 .csv 文件在您的工作目录中。

ldir <- getwd()    

将他们的名字存储在一个向量中。

## list names
nm <- paste0(ldir, dir(pattern="tab\\d"))  ## list names
nm <- paste0(ldir, c("tab1.csv", "tab2.csv", "tab3.csv", "tab4.csv"))  ## or hard coded

首先让我们检查示例 .csvs 的头部。

## inspect head of each .csv
lapply(nm, function(i) head(read.csv(i), 3))
# [[1]]
#           X1        X2         X3        X4
# 1  1.3709584  1.304870 -0.3066386 0.4554501
# 2 -0.5646982  2.286645 -1.7813084 0.7048373
# 3  0.3631284 -1.388861 -0.1719174 1.0351035
# 
# [[2]]
#           X1         X2         X3          X4
# 1  0.2059986  0.3219253 -0.3672346 -1.04311894
# 2 -0.3610573 -0.7838389  0.1852306 -0.09018639
# 3  0.7581632  1.5757275  0.5818237  0.62351816
# 
# [[3]]
#           X1         X2        X3          X4
# 1 1.51270701  1.3921164  1.200965 -0.02509255
# 2 0.25792144 -0.4761739  1.044751  0.10807273
# 3 0.08844023  0.6503486 -1.003209 -0.48543524
# 
# [[4]]
#           X1            X2         X3          X4
# 1 -1.4936251  5.676206e-01 -0.0861073 -0.04069848
# 2 -1.4704357 -4.928774e-01 -0.8876790 -1.55154482
# 3  0.1247024  6.288407e-05 -0.4446840  1.16716955

然后,将要删除的列名放入另一个向量中。

## select columns to delete
to.del <- c("X2", "X4")

最后,我们使用mapply 对两个向量进行多元循环。在 FUN 中,write.csv 有两个版本,一个覆盖原始 .csv,一个复制。

## read, delete, and write back
mapply(function(x, y) {
  r <- read.csv(x)
  # write.csv(r[, !names(r) %in% y], row.names=FALSE, file=x)  ## use to override
  write.csv(r[, !names(r) %in% y], row.names=FALSE, 
              file=paste0(dirname(x), "copy_of_", basename(x)))  ## use for copy
  }, nm, list(to.del))

让我们检查一下,是否一切都按预期进行。

## check result
lapply(paste0(dirname(nm), "copy_of_", basename(nm)), function(i) 
  head(read.csv(i), 3))
# [[1]]
#           X1         X3
# 1  1.3709584 -0.3066386
# 2 -0.5646982 -1.7813084
# 3  0.3631284 -0.1719174
# 
# [[2]]
#           X1         X3
# 1  0.2059986 -0.3672346
# 2 -0.3610573  0.1852306
# 3  0.7581632  0.5818237
# 
# [[3]]
#           X1        X3
# 1 1.51270701  1.200965
# 2 0.25792144  1.044751
# 3 0.08844023 -1.003209
# 
# [[4]]
#           X1         X3
# 1 -1.4936251 -0.0861073
# 2 -1.4704357 -0.8876790
# 3  0.1247024 -0.4446840

嗯。


示例数据:

## generate example .csvs in wd
set.seed(42)
sapply(1:4, function(i) write.csv(data.frame(matrix(rnorm(10*4), 10, 4)), 
                                  row.names=FALSE, file=paste0("tab", i, ".csv")))

【讨论】:

  • 当我尝试运行 lapply 部分时,我收到以下错误 Error during wrapup: unimplemented type (29) in 'eval' Error: no more error handlers available (recursive errors?);在包装期间调用“中止”重新启动错误:INTEGER()只能应用于“整数”,而不是“未知类型#29”错误:没有更多可用的错误处理程序(递归错误?);调用“中止”重新启动浏览[1]>
  • 总结时出错:无法打开连接
  • @AminHosseini 代码对我有用。你能提供sessionInfo()吗?
  • 这里是:R 版本 4.0.2 (2020-06-22) 平台:x86_64-w64-mingw32/x64 (64-bit) 运行条件:Windows 10 x64 (build 15063) Matrix 产品:默认语言环境:[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 附加的基本包:[1] 统计图形 grDevices通过命名空间加载的 utils 数据集方法库(未附加):[1] compiler_4.0.2 tools_4.0.2
  • @AminHosseini 对我来说看起来像是一个全新的 R 会话。我也在运行windows,win7,但这不应该有任何区别。我更正了“## 检查结果”basename(nm) 中的一个小问题,但我相信这不是问题所在。抱歉,恐怕我不知道您的连接无法打开是怎么回事。 ://
猜你喜欢
  • 2021-08-18
  • 2014-03-26
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多