无法命名加载的文件 - R.

时间:2017-09-27 15:27:36

标签: r loops dataframe import

所以我有一堆包含csv的文件夹,我将wd设置为该文件夹并提取文件名称:

data_dir <- "~/Desktop/All Waves Data/csv"  
setwd(data_dir)  
vecFiles <- list.files(data_dir)

一切都很好,现在当我尝试使用vecFiles上的循环加载所有文件时出现问题:

for(fl in vecFiles) { 
fl <- read.csv(vecFiles[i], header = T, fill = T) 
}

循环在命名时将'fl'视为普通字符串,结果只保存'fl'下的最后一个文件(通过每次覆盖前一个文件)。

我试图找出 为什么 这种情况发生但失败了。
有什么解释吗?

编辑:尝试实现以下功能:假设您有一个包含data1.csv,data2.csv ... datan.csv的文件夹,我想将它们加载到名为data1,data2的数据框中..... datan

2 个答案:

答案 0 :(得分:1)

加载文件时,您没有声明任何新内容。每次加载时,它都会加载到fl,因此您只能看到vecFiles中的最后一个文件。

一些潜在的解决方案。

首先lapply

fl <- lapply(vecFiles, function(x) read.csv(x, header=T, fill=t) )
names(fl) <- vecFiles

这将在fl。

中创建一个元素列表

第二个'rbind':

假设您的数据具有所有相同的列:

fl <- read.csv(vecFiles[1], header=T, fill=t)

for(i in vecFiles[2:length(vecFiles)]){
fl <- rbind(fl, read.csv(vecFiles[i], header=T, fill=t) )
}

希望这很有用!

答案 1 :(得分:1)

您希望从工作目录中读取所有csv文件,并将这些文件的位置保存在vecFiles中。

为什么你的尝试不起作用

您当前正在做的事情不起作用,因为您在每次迭代中都使用新加载的csv文件覆盖对象fn。在完成所有迭代之后,您只剩下最后覆盖的fn对象。

另一个澄清为什么fn仅包含最后一个csv文件的值的示例:如果在line1中声明fn <- "abc",在行2中声明fn <- "def"(即覆盖{来自第1行的{1}}您显然会在第2行之后的fn中保存值"def",对吗?

fn

解决方案

有两种突出的方法可以解决这个问题:1)坚持使用略微改变的fn <- "abc" fn <- "def" fn #[1] "def" - 循环。 2)使用for

1)更改后的sapply()循环:创建一个名为for的空列表,并将加载的csv文件分配给fn个元素每次迭代都列出:

i

2)使用fn <- list() for(i in seq_along(vecFiles)){ fn[[i]] <- read.csv(vecFiles[i], header=T, fill=T) } names(fn) <- vecFiles sapply()sapply() - 用户喜欢使用的功能,而不是R - 循环。

for

请注意,您也可以使用fn <- sapply(vecFiles, read.csv, header=T, fill=T) names(fn) <- vecFiles 代替lapply()。唯一的区别是sapply()为您提供了一个列表作为输出