假设我们有一个包含多个data.csv文件的文件夹,每个文件包含相同数量的变量,但每个变量包含不同的时间.R中有没有办法同时导入它们而不必单独导入它们?
我的问题是我有大约2000个数据文件要导入,只需使用代码就可以单独导入它们:
read.delim(file="filename", header=TRUE, sep="\t")
Run Code Online (Sandbox Code Playgroud)
不是很有效率.
我刚刚将readr软件包从版本0.1.1 更新到0.2.0,但现在在抛出错误之前有效的操作.
在更新之前,我使用readr包执行此操作:
file.list <- list.files(<path>, pattern='*.csv')
df.list <- lapply(file.list, read_csv2)
df.list <- lapply(df.list, function(x) x[-1,])
Run Code Online (Sandbox Code Playgroud)
最后一步是必要的,因为我有一些带有特殊字符的长标题,以某种方式导致额外的行被读取.这是另一个问题,但只是删除第一行一直工作到那时.
read_csv2 警告我有关列名称的问题但是,如上所述,我通过删除行来修复:
Warning: 1 parsing failure.
row col expected actual
1 -- 227 columns 222 columns
Run Code Online (Sandbox Code Playgroud)
然后我继续将所有数据帧绑定到一个dplyr::bind_rows(因为每个.csv具有相同的头).这之前完美无缺,但现在当我这样做时,我得到了
> full.data <- bind_rows(df.list)
Error: corrupt data frame
Run Code Online (Sandbox Code Playgroud)
我没有改变任何其他东西(相同的R版本,相同的RStudio版本,没有更新其他包).有经验的人有什 与read_csv2的工作方式相比,版本0.1.1有任何重大变化.
谢谢
我设法创建一个循环,打开我在文件夹中的csv文件,并在第一列中添加文件名.但是,我不知道如何将所有创建的表放在一起,以便循环后的最终输出是一个data.frame与所有csv一起(文件名作为第一列).我尝试使用cbind,但它不起作用.任何帮助都感激不尽.这是我的尝试:
csvfilenames <- list.files("/Users/carlos/Desktop/TestCSVFilesToMerge/",
pattern="*.csv", all.files=FALSE, full.names=FALSE) #creates a list with the file names
csvfilenames
for(i in 1:length(csvfilenames))
{
a=csvfilenames[i]
temp1<-read.csv(file=paste("/Users/carlos/Desktop/TestCSVFilesToMerge/",a,sep=""), sep=";", header=T)
temp2<-cbind("FileName"=a,temp1[,1:ncol(temp1)]) #add a column called FileName in position 1
temp[a]=temp2
}
output=rbind(temp[[a]])
output
Run Code Online (Sandbox Code Playgroud)