2010-01-20 15 views
14

Mam nazwy plików o nazwie <InputData>.<TestName>.csv i chciałbym tworzyć wykresy dla każdego testu. Najlepszym sposobem na zrobienie tego jest zrobienie jednej tabeli R dla każdego TestName. Każdy test generuje te same kolumny danych, więc chciałbym pobrać wszystkie dane dla każdego testu do danych R z dodatkową kolumną dla danych wejściowych.Jak odczytać (set) wiele plików w jednej tabeli w R?

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 

Jaki jest właściwy sposób to zrobić? Jakieś istniejące funkcje, o których nie wiem? Zapisywanie go w języku R za pomocą pętli for?

Odpowiedz

12

nie mogę przetestować go na swoich danych, ale będziemy chcieli użyć funkcji apply typ tak:

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

Albo można uprościć go za pomocą plyr. Oto szorstki symulacja, jak to będzie działać (z wykorzystaniem danych ramki zamiast plików):

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

W tym przypadku będę używał 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 

Edycja

Biorąc pod uwagę sugestię Marka, możesz nadpisać lub stworzyć 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")) 
+0

W drodze do całkowitej uogólnienia: 'read.tables <- funkcyjne (pliki, ...) ldply (plików, funkcja (f) data.frame (Filename = f, przeczytaj .csv (f, ...))) '(wtedy możemy przekazać argumenty do' read.csv') – Marek

+2

Zwykle robię coś w stylu 'names (file.names) <- basename (file.names); ldply (file.names, read.csv) '- wtedy nie musisz samodzielnie dodawać kolumny nazwy pliku. – hadley

+0

To było cudownie pomocne, dzięki! – Thelema

10

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) 
} 
+0

Aby móc śledzić dane według nazwy pliku, chętnie wybieram nazwę ze zmiennej 'f'. Użyłem pakietu 'tools', aby uzyskać nazwę pliku za pomocą' file_path_sans_ext'. Jedynym zastrzeżeniem jest to, że wysyła on za pomocą wektora col/row id (dimension). Jak mogę uzyskać tylko imię? – bonCodigo

Powiązane problemy