【问题标题】:Reading, merging & sorting .csv files读取、合并和排序 .csv 文件
【发布时间】:2016-09-06 20:49:32
【问题描述】:

我对 R 很陌生,但我会编程。我可能只是厌倦了自己在这个阶段的进步,所以这是我的问题;

大量 .csv 文件,很大 (6MB),其中包含我需要在之后进行分析的光谱数据。我正在尝试读取数据 - FrequencyVoltage 两列(V 为 dB 值),每个文件 500,000 个数据点。我想为每 10 个文件将第二列的数据“合并”到一个新数据集中。

例如:10 个文件,10 个频率(每个文件都一样,所以暂时可以忽略)和10 个电压。从第 2 列的 Voltage 中获取数据并将其合并到一个数据集中。如果我有 10 个文件 = 我最终得到一个数据集,100 个文件 = 10 个数据集。希望最终每个数据集将有 11 列 |频率 | V1 | V2 | ... | V10 |。对每个文件进行索引匹配会很好,但我不确定我的 PC 是否能够在升级资源之前进行匹配。

这可能看起来很复杂,欢迎所有建议,在尝试对 1200 个 .csv 文件进行排序甚至只是读取其中的 100 个文件时,内存似乎是一个问题。感谢您的宝贵时间!

【问题讨论】:

    标签: r


    【解决方案1】:

    我没有对此进行测试,因为我显然没有你的数据,但类似下面的代码应该可以工作。基本上,您创建一个包含所有文件名的向量,然后一次读取、组合和写入其中的 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行rbindbind_rows,看起来像你在行中设置数据,我习惯了电子表格和矩阵组数据,你能解释一下为什么吗?它是 R 的东西吗?!
    • for (var in seq) 是我在 R 中能想到的唯一一种情况,其中in 用于逻辑表达式。这只是一种设置for 循环迭代的方法。在这种情况下,我们使用它一次选择 10 行。在其他情况下,对于向量之间的匹配,您可以使用%in%,如x %in% y。请参阅?`%in%`?Control 了解更多信息。
    • 关于 rbindbind_rowsrbind 是用于堆叠两个数据帧或矩阵的基本 R 函数。但是,如果您在一个列表中有多个数据框并且您想要将它们全部堆叠起来,您可以使用do.call(rbind, dat)do.call 在整个数据帧列表上迭代调用 rbindbind_rows 是一个对整个列表进行操作的 dplyr 函数。 bind_rows(dat)do.call(rbind, dat) 在这种情况下是等价的。但是,如果数据框的列名或列数不同,bind_rows 也可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2018-10-08
    • 2011-08-04
    • 2019-04-29
    相关资源
    最近更新 更多