读取,合并和排序.csv文件
问题描述:
我对R很新,但是要做程序。在这个阶段我可能只是厌倦了自己的进步,所以这是我的问题;读取,合并和排序.csv文件
大量的.csv文件,大量(6MB)带有我需要做分析的频谱数据。我试图读取数据 - 两列频率和电压(V为dB值),每个文件500,000个数据点。我想在每10个文件的新数据集中“合并”来自第二列的数据。
例如:10个档,十个频率(所有相同每个所以可以暂时忽略不计)和十个电压。从第二列中的电压获取数据并将其合并到数据集中。如果我有10个文件=我结束了一个数据集,100个文件= 10个数据集。希望最终每个数据集将有11列|频率| V1 | V2 | ... | V10 |。对每个文件进行索引匹配会很好,但我不确定我的电脑能否支持它,除非我升级资源。
这看起来似乎很安静,所有的建议都欢迎,当尝试对1200个.csv文件进行排序或者甚至只读取100个文件时,内存似乎成了一个问题。谢谢你的时间!
答
我还没有测试过,因为我显然没有你的数据,但像下面的代码应该工作。基本上,你创建一个包含所有文件名的矢量,然后一次读取,合并和写入它们中的10个。
library(reshape2)
library(dplyr)
# Get the names of all the csv files
files = list.files(pattern="csv$")
# Read, combine, and save ten files at a time in each iteration of the loop
for (i in (unique(1:length(files)) - 1) %/% 10)) {
# Read ten files at a time into a list
dat = lapply(files[(1:length(files) - 1) %/% 10 == i], function(f) {
d=read.csv(f, header=TRUE, stringsAsFactors=FALSE)
# Add file name as a column
d$file = gsub("(.*)\\.csv$", "\\1", f)
return(d)
})
# Combine the ten files into a single data frame
dat = bind_rows(dat)
# Reshape from long to wide format
dat = dcast(Frequency ~ file, value.var="Voltage")
# Write to csv
write.csv(dat, paste("Files_", i,".csv"), row.names=FALSE)
}
在另一方面,如果你只想他们都合并到长格式的单个文件,这将使得分析变得更容易(如果你当然有足够的内存):
# Read all files into a list
dat = lapply(files, function(f) {
d = read.csv(f, header=TRUE, stringsAsFactors=FALSE)
# Add file name as a column
d$file = gsub("(.*)\\.csv$", "\\1", f)
return(d)
})
# Combine into a single data frame
dat = bind_rows(dat)
# Save to csv
write.csv(dat, "All_files_combined.csv", row.names=FALSE)
尼斯一个@ eipi10,感谢您的快速回复。 14号线我真的很感激,一直在寻找!几个问题; 1)你能解释'in'函数吗?找不到对它的引用。 2)第14行'rbind'或'bind_rows',它看起来像你的设置数据的行,我用来传播工作表和矩阵组数据,你能解释为什么吗?这是一个R的东西?! –
'for(var in seq)'是我能想到的R中唯一的情况,其中'in'用于逻辑表达式中。这只是设置'for'循环迭代的一种方式。在这种情况下,我们使用它来选择10行作为时间。在其他上下文中,为了在向量之间进行匹配,您可以使用'%in%'作为'%y'中的'x%'。请参阅'?\'%在%\''和'?Control'中获取更多信息。 – eipi10
关于'rbind'与'bind_rows':'rbind'是用于堆栈两个数据帧或矩阵的基本R函数。但是,如果列表中有多个数据帧,并且想要将它们全部堆叠起来,则可以执行'do.call(rbind,dat)'。 'do.call'在整个数据帧列表上迭代调用'rbind'。 'bind_rows'是一个在整个列表上运行的'dplyr'函数。 'bind_rows(dat)'和'do.call(rbind,dat)'在这种情况下是等价的。但是,如果数据框不是全部具有相同的列名称或相同数量的列,则'bind_rows'也可以工作。 – eipi10