2016-03-25 16 views
0

Yıllık ve üç aylık verilerle çalışıyorum ve her yıl dört farklı CSV'den dört çeyrek veri dolaşan ve okuyan bir döngü yazmak istiyorum.Csv'leri dinamik olarak bir listeden mi yoksa bir vektörle mi okuyorsunuz?

#prep strings 

beg <- "fmli" 
end <- ".csv" 

fileList <- c() 

for(i in 1996:2012){ 
    yearString <- toString(i) 
    year <- substr(toString(i), 3,4) 
    for(i in 1:4){ 
    quarter <- toString(i) 
    fileToRead <- paste(sep="", beg, year, quarter, end) 
    #add to list 
    #fileList <- append(fileToRead, i) 
    } 
    a1 <- read.csv(fileList[1]) 
    a2 <- read.csv(fileList[2]) 
    a3 <- read.csv(fileList[3]) 
    a4 <- read.csv(fileList[4]) 
} 

Esasen, ben a1-a4 için o yılın 4 çeyrek atayarak sonuna kadar bu döngü gerekir. Bunu başarmak böylece:

#I want it to do this, but automated 

#1996 quarterly files 
a1 <- read.csv("fmli961.csv") 
a2 <- read.csv("fmli962.csv") 
a3 <- read.csv("fmli963.csv") 
a4 <- read.csv("fmli964.csv") 

#run the script 

#1997 quarterly files 
a1 <- read.csv("fmli961.csv") 
a2 <- read.csv("fmli962.csv") 
a3 <- read.csv("fmli963.csv") 
a4 <- read.csv("fmli964.csv") 

#run the script again 

#etc, etc 

ben döngü için içinde listeye eklenecek olarak nasıl bir kayıp am - Ben bu muhtemelen bu yazma konusunda gitmek için en etkili yol olmadığını anlamaya R, ama bir liste kullanın

+0

Olası kopyalar http://stackoverflow.com/questions/21156271/fast-reading-and-combining-several-files- - data-table-with-fread) – MichaelChirico

cevap

2

... bu yüzden bu yaklaşıma tür evliyim UF'ların dörtte atayarak senaryoyu yazdı:

beg <- "fmli" 
end <- ".csv" 

for(i in 1996:2012){ 
    yearString <- toString(i) 
    year <- substr(toString(i), 3,4) 
    dataList <- list() 
    for(j in 1:4){ 
    quarter <- toString(j) 
    fileToRead <- paste(sep="", beg, year, quarter, end) 
    #add to list 
    dataList[[j]] <- read.csv(fileToRead) 
    } 
    names(dataList) <- c("a1", "a2", "a3", "a4") 
    # then run your script on dataList[["a1"]], dataList[["a2"]], etc. 
} 

Üzgünüz, liste için çift parantez unuttum. Ben her zaman böyle yaparız:/

+0

Sebep ne olursa olsun, bu sadece veri çerçevesinin bir sütununu listeye ekler ve liste 4 tamsayı vektörünün bir listesi olur. Bu neden oluyor? – skathan

+0

Yep. Bunu anladım. Ayrıca, diğerlerinin yaptığı gibi, iç döngüdeki ikinci ji'yi 'j' olarak değiştirmek belki de biraz daha mantıklıdır. Ama bu işe yaradı ve ne istediğime en yakın oldu, bu yüzden ben devam edeceğim ve onay işareti vereceğim :) – skathan

+0

İyi çağrı, üzerine yazarak 'i' kesinlikle her şeyi kırmadım :) – fanli

1

İşte nasıl yaparım. for s yerine, bunun yerine lapply kullanın. İçindeki işlev tarafından döndürülen nesne bir listenin parçası olacaktır. İç içe lapply s kullanma

lapply(setNames(1996:2012, paste0("y", 1996:2012)), function(y) { 
    year <- substr(y, 3, 4) 
    lapply(setNames(1:4, paste0("a", 1:4)), function(qt) { 
    fileToRead <- paste0("fmli", y, qt, ".csv") 
    read.csv(fileToRead) 
    }) 
}) 

yıllardır listesi ile bitireceğiz, ve unsurları her çeyrek için data.frames listeleridir. Adlandırılmış bir vektör oluşturmak için setNames kullanıyoruz, bu isimler liste elemanlarının isimleri olacak (yıl ve çeyrekler).

Bir sayı string olarak kullanıldığında, toString kullanmanız gerekmediğini unutmayın. En çok (tümü?) Işlevlerde bu zorlama otomatik olarak yapılır.

+1

'paste' denemeye çalışacaktır Karakteri zorlamak, ama OP için daha geniş bir nokta, 'as.character' için tasarlanan 'toString' yanlış var olduğunu düşünüyorum, bence. – joran

+0

@joran Gerçekten de bunu unutmuştum. Bu yüzden başka bir dil okuyormuş gibi görünüyordu ... – Molx

-1

Her zaman .csv dosyalarını okumak için assign kullanıyorum.

#prep strings 

beg <- "fmli" 

end <- ".csv" 

a <- c("a1", "a2", "a3", "a4"); 

for(i in 1996:2012){ 
    year <- substr(toString(i), 3,4) 
    for(j in 1:4){ 
    quarter <- toString(j) 
    fileToRead <- paste(beg, year, quarter, end, sep="") 
    assign(a[j], read.csv(file=fileToRead)); 
    } 

    # Now use your script on a1-a4 
    # a1-a4 will be overwritten in next iteration 

} 
[Hızlı okuma ve data.table (freadla) kullanarak birkaç dosya birleştirme] (içinde
+0

Bu, "atama" sadece dizelerle çalıştığı için işe yaramaz - bu 'geçersiz ilk bağımsız değişken' hatasını döndürür ... herhangi bir fikir? – skathan

+0

Rahatsızlık için özür dilerim. Tabii ki dizi a dizeleri içermeli ve bir [j] ile değil, bir [i] 'ile erişilmesi gerekir. –

İlgili konular