2010-01-20 22 views
14

<InputData>.<TestName>.csv isimli dosya ismim var ve her bir test için grafik yapmak istiyorum. Bunu yapmak için görebildiğim en iyi yol, her bir TestAdı için bir R tablosu yapmaktır. Her bir test aynı veri sütunlarını üretir, bu yüzden her bir test için tüm verileri giriş verileri için fazladan bir sütun içeren bir R verisine çekmek istiyorum.R'de tek bir tablonun içine birden fazla dosya nasıl okunur().

ben yapmak istiyorum:

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

(örneğin) üretir:

 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 

Bunu yapmak için doğru yolu nedir? Bilmediğim bazı mevcut işlevler? Bir for döngüsünü kullanarak R dilinde yazabiliyor musunuz? Eğer plyr kullanarak bu kolaylaştırabilirsiniz,

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

Veya:

cevap

12

Ben senin verilere test edemez, ancak böyle bir apply tip işlevi kullanmak isteyecektir. İşte bu işe nasıl kaba bir simülasyon (verileri kullanılarak yerine dosyaların kare) bulunuyor:

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

Bu durumda ben read.csv yerine get kullanacağız:

> 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 Marek'in önerisini alarak, kendi işlevinizin üzerine yazabilir veya kendi işlevlerinizi oluşturabilirsiniz:

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

toplam genellemekle şekilde: 'read.tables <- fonksiyonu (dosyalar, ...) ldply (dosyalar, fonksiyon (f) data.frame (Dosya adı = f okumak .csv (f, ...))) '(sonra argümanları 'read.csv'ye iletebiliriz) – Marek

+2

Normalde' isim (file.names) <- basename (file.names); ldply (dosya.names, read.csv) '- sonra dosya adı sütununu kendiniz eklemeniz gerekmez. – hadley

+0

Bu çok yardımcı oldu, teşekkürler! – Thelema

10

bu deneyin:

## 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

Verileri dosya ismine göre takip etmek için, 'f' değişkeninin ismini almayı düşünüyorum. 'File_path_sans_ext' kullanarak dosya adını almak için' '' '' pack' paketini kullandım. Tek uyarı, vektör col/row id (boyut) ile çıktı. Sadece ismi nasıl alabilirim? – bonCodigo

İlgili konular