所以我有一堆包含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
答案 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()
为您提供了一个列表作为输出