Jak czytać.table () wiele plików w jedną tabelę w R?

Mam nazwy plików <InputData>.<TestName>.csv i chciałbym zrobić wykresy dla każdego testu. Najlepszym sposobem, jaki widzę, aby to zrobić, jest utworzenie jednej tabeli R dla każdej nazwy testu. Każdy test wytwarza te same kolumny danych, więc chciałbym pobrać wszystkie dane dla każdego testu do datatable r z dodatkową kolumną dla inputdata.

Chciałbym zrobić:

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

Produkuje (na przykład):

       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
Jak to zrobić? Jakaś istniejąca funkcja, o której Nie wiem? Wypisując to w język R za pomocą pętli for?
 15
Author: Marek, 2010-01-20

2 answers

Nie mogę tego przetestować na Twoich danych, ale będziesz chciał użyć apply funkcji typu jak ta:

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

Lub, można go uprościć za pomocą plyr. Oto przybliżona symulacja tego, jak to będzie działać (używając ramek danych zamiast plików):

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

W tym przypadku użyję get zamiast 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

Edit

Biorąc pod uwagę sugestię Marka, możesz albo nadpisać, albo utworzyć własną funkcję:

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"))
 12
Author: Shane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-20 21:25:42

Spróbuj tego:

## 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)
}
 11
Author: larus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-20 20:51:49