如何将read.table()多个文件读入R中的单个表?

The*_*ema 15 import r

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

我想这样做:

read.tables(c("B217.SE.csv", "C10.SE.csv"), sep=",")
Run Code Online (Sandbox Code Playgroud)

产生(例如):

       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
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ane 12

我不能在你的数据上测试它,但你会想要使用这样的apply类型函数:

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

或者,您可以使用简化它plyr.这是一个粗略的模拟,它将如何工作(使用数据框而不是文件):

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

在这种情况下,我将使用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
Run Code Online (Sandbox Code Playgroud)

编辑

根据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"))
Run Code Online (Sandbox Code Playgroud)

  • 我通常会做`names(file.names)< - basename(file.names); ldply(file.names,read.csv)` - 那么你不需要自己添加文件名列. (2认同)

lar*_*rus 11

试试这个:

## 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)
}
Run Code Online (Sandbox Code Playgroud)