R:将列添加到文件夹中的多个文件并保存

时间:2017-06-26 15:23:54

标签: r function csv lapply

我正在尝试将相同的函数应用于文件夹中的所有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)

1 个答案:

答案 0 :(得分:1)

只需更改函数接收一个文件的参数,然后传递lapply内的整个文件列表。作为信息,lappy可能是应用函数系列中最受欢迎的,它接收列表/向量输入并返回等长列表,其中每个输入列表元素被传递到函数中。

具体来说, 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