2017-06-26 39 views
0

我试图将相同的函数应用于文件夹中的所有csv文件(相同的结构) - 添加两个基于'旧'列的新列,将0.05添加到每个变量然后将其保存在与csv相同的文件夹中。应该很容易在这里有几个例子做这件事,大都采用lapply,但是,我一直运行到一个错误:R:将列添加到文件夹中的多个文件并保存

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) 
+0

你能发表一个文件的例子吗? – RobertMc

+0

另外,请添加您用于该任务的代码。这种错误本身并不是很有用。 –

+0

你的'lapply'电话在哪里?本身,发布的代码不应该做任何事情。 – Parfait

回答

1

其中函数接收一个文件,你通过内部lapply文件的整个列表,只需更改参数的一些示例代码。作为信息,lappy可能是应用系列功能中最受欢迎的,它接收一个列表/向量输入并返回一个等长列表,其中每个输入列表元素被传递给一个函数。

具体地说这里RES返回my_files dataframes等于文件的数量的列表,每列的值的改变。此外,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 
+0

非常感谢代码!我收到了一些警告消息,即write.csv的设置被忽略,但它似乎工作得很好。谢谢! – Kristina

+0

没问题!乐意效劳。尝试删除* sep *参数,因为它对于'write.csv'是冗余的(总是逗号);它通常用于通用的'write.table'。 – Parfait

相关问题