【问题标题】:How to read.table() multiple files into a single table in R?如何将多个文件读取到 R 中的单个表中?
【发布时间】:2011-01-07 10:47:51
【问题描述】:

我有名为<InputData>.<TestName>.csv 的文件名,我想为每个测试制作图表。我能看到的最好方法是为每个 TestName 制作一个 R 表。每个测试都会产生相同的数据列,因此我想将每个测试的所有数据都提取到一个 R 数据表中,并为输入数据添加一个额外的列。

我想做:

read.tables(c("B217.SE.csv", "C10.SE.csv"), sep=",")

产生(例如):

       Filename  col1   col2
1   B217.SE.csv     1      2
2   B217.SE.csv     2      4
3   C10.SE.csv      3      1
4   C10.SE.csv      4      5

这样做的正确方法是什么?一些我不知道的现有功能?用 R 语言用 for 循环写出来?

【问题讨论】:

    标签: r import


    【解决方案1】:

    我无法在您的数据上对其进行测试,但您会希望使用像这样的 apply 类型函数:

    data <- do.call("rbind", lapply(c("file1", "file2"), function(fn) 
               data.frame(Filename=fn, read.csv(fn)
    ))
    

    或者,您可以使用plyr 来简化它。下面是它如何工作的粗略模拟(使用数据帧而不是文件):

    > df1 <- data.frame(c1=1:5, c2=rnorm(5))
    > df2 <- data.frame(c1=3:7, c2=rnorm(5))
    

    在这种情况下,我将使用get 而不是read.csv

    > data <- ldply(c("df1", "df2"), function(dn) data.frame(Filename=dn, get(dn)))
    > data
      Filename c1          c2
    1  df1  1 -0.15679732
    2  df1  2 -0.19392102
    3  df1  3  0.01369413
    4  df1  4 -0.73942829
    5  df1  5 -1.27522427
    6  df2  3 -0.33944114
    7  df2  4 -0.12509065
    8  df2  5  0.11225053
    9  df2  6  0.88460684
    10 df2  7 -0.70710520
    

    编辑

    采纳 Marek 的建议,您可以覆盖或创建自己的函数:

    read.tables <- function(file.names, ...) {
        require(plyr)
        ldply(file.names, function(fn) data.frame(Filename=fn, read.csv(fn, ...)))
    }
    
    data <- read.tables(c("filename1.csv", "filename2.csv"))
    

    【讨论】:

    • 全面泛化:read.tables &lt;- function(files, ...) ldply(files, function(f) data.frame(Filename=f, read.csv(f,...)))(然后我们可以将参数传递给read.csv
    • 我通常会做类似names(file.names) &lt;- basename(file.names); ldply(file.names, read.csv) 之类的操作 - 然后你就不需要自己添加文件名列了。
    【解决方案2】:

    试试这个:

    ## take files.
    files <- list.files(pattern=".csv")
    ## read data using loop
    DF <- NULL
    for (f in files) {
       dat <- read.csv(f, header=T, sep="\t", na.strings="", colClasses="character")
       DF <- rbind(DF, dat)
    }
    

    【讨论】:

    • 为了按文件名跟踪数据,我热衷于从f 变量中获取名称。我使用tools 包来获取使用file_path_sans_ext 的文件名。唯一需要注意的是,它使用向量 col/row id(维度)输出。我怎样才能只得到名字?
    猜你喜欢
    • 2021-06-19
    • 2023-01-24
    • 2019-01-13
    • 2015-11-08
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多