【问题标题】:R: Add column to several files in folder and saveR:将列添加到文件夹中的多个文件并保存
【发布时间】:2017-11-29 11:51:24
【问题描述】:

我正在尝试将相同的函数应用于文件夹中的所有 csv 文件(相同的结构) - 基于“旧”列添加两个新列,将 0.05 添加到每个变量,然后以相同的名称保存它文件夹为 csv。应该很容易,这里有几个例子可以做到这一点,主要是使用 lapply,但是,我一直遇到错误:

Error in `$<-.data.frame`(`*tmp*`, "LAT", value = numeric(0)) : replacement has 0 rows, data has 3

这是我的代码:

my_files <- list.files(path="C:/PATH", pattern=".csv", full.names=T, recursive=FALSE)
add_col <- function(my_files) {
  mpa <- read.csv(my_files, header=T)
  mpa$LAT <- mpa$lat_bin + 0.05
  mpa$LON <- mpa$lon_bin + 0.05
  return(mpa)
  write.csv(mpa, 
            append = FALSE,
            quote = FALSE,
            sep = ",",
            row.names = FALSE,
            col.names = TRUE)
}

我不确定如何最好地处理大量文件。

这是文件的一些示例代码

Df1 <- data.frame(lat_bin = c(50,40,70,6,8,4),lon_bin = (c(1,5,2,4,9,11)))
Df2 <- data.frame(lat_bin = c(66, 77, 82, 65, 88, 43),lon_bin = (c(2,3,4,5,11,51)))
Df3 <- data.frame(lat_bin = c(43,46,55,67,1,11),lon_bin = (c(7,6,5,9,11,15)))
write.csv(Df1, "data_1.csv", row.names=F)
write.csv(Df2, "data_2.csv", row.names=F)
write.csv(Df3, "data_3.csv", row.names=F)

【问题讨论】:

  • 您能发布其中一个文件的示例吗?
  • 另外,请添加您用于该任务的代码。这种错误本身并不是很有用。
  • 您的lapply 电话在哪里?就其本身而言,发布的代码不应该做任何事情。
  • @Parfait,我知道 lapply 可以用于它,但到目前为止我无法使其工作并且并不真正理解它 - 因此我尝试仅使用函数来完成它跨度>
  • 但是你在哪里调用这个函数呢?你只在这里分配它。产生错误的原因是什么?

标签: r function csv lapply


【解决方案1】:

只需更改函数接收一个文件的参数,然后在lapply 中传递整个文件列表。作为信息,lappy 可能是最流行的 apply 系列函数,它接收列表/向量输入并返回一个等长列表,其中每个输入列表元素都传递给一个函数。

这里 res 返回一个数据框列表,该列表等于 my_files 中文件的数量,每个文件的列值都发生了变化。此外,write.csv 缺少文件名,但下面保存了带有 _new 后缀的新 csv 文件(双斜杠转义句点,正则表达式中的特殊字符)。

my_files <- list.files(path="C:/PATH", pattern=".csv", full.names=T, 
                       recursive=FALSE)

add_col <- function(one_file) {
  mpa <- read.csv(one_file, header=T)
  mpa$LAT <- mpa$lat_bin + 0.05
  mpa$LON <- mpa$lon_bin + 0.05
  write.csv(mpa, 
            file = sub("\\.csv", "_new\\.csv", one_file),
            append = FALSE,
            quote = FALSE,
            sep = ",",
            row.names = FALSE,
            col.names = TRUE)
  return(mpa)
}

res <- lapply(my_files, function(i) add_col(i))    # LONGER VERSION
res <- lapply(my_files, add_col)                   # SHORTER VERSION

【讨论】:

  • 非常感谢您的代码!我收到几条警告消息,即 write.csv 的设置被忽略,但它似乎工作得很好。谢谢!
  • 没问题!乐意效劳。尝试删除 sep 参数,因为它对于 write.csv 是多余的(总是逗号);它通常用于一般的write.table
猜你喜欢
  • 2019-06-18
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多