读取,合并和排序.csv文件

读取,合并和排序.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) 
+0

尼斯一个@ eipi10,感谢您的快速回复。 14号线我真的很感激,一直在寻找!几个问题; 1)你能解释'in'函数吗?找不到对它的引用。 2)第14行'rbind'或'bind_rows',它看起来像你的设置数据的行,我用来传播工作表和矩阵组数据,你能解释为什么吗?这是一个R的东西?! –

+0

'for(var in seq)'是我能想到的R中唯一的情况,其中'in'用于逻辑表达式中。这只是设置'for'循环迭代的一种方式。在这种情况下,我们使用它来选择10行作为时间。在其他上下文中,为了在向量之间进行匹配,您可以使用'%in%'作为'%y'中的'x%'。请参阅'?\'%在%\''和'?Control'中获取更多信息。 – eipi10

+0

关于'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