2011-03-03 17 views
18

Çok sayıda csv dosyam var. Okumak istediğim Csv dosyaları aynıdır. İlk başta dosya isimleri listesine göre bir döngü oluşturmam gerektiğini düşündüm, ancak aramadan sonra daha hızlı bir yol buldum. Bu, tüm csvs'leri doğru okur ve birleştirir (bildiğim kadarıyla). Tek sorun, belirli bir veri dizisinin hangi csv'den geldiğini bilmek istememdir. Belirli satırın csv adını içeren 'source' etiketli bir sütun istiyorum.CSV'yi, CSV'nin adını içeren sütun nasıl üretilir?

> City State Market etc Source 
> Burbank IL  Western etc Chicago_IL 

cevap

21

veri satırı, bu gibi bir şey olur Ar girince böylece örneğin csv Chicago_IL.csv çağrıldı eğer zor iş. Oldukça küçük bir modifikasyon ile, bu düz-ileri olmalıdır.

mantıktır:

  1. bireysel csv okur ve dosya adını içeren bir sütun ekler küçük bir yardımcı işlev oluşturun.
  2. Çağrı llply bu yardımcı işlevi()

şu çalışmalıdır:

read_csv_filename <- function(filename){ 
    ret <- read.csv(filename) 
    ret$Source <- filename #EDIT 
    ret 
} 

import.list <- ldply(filenames, read_csv_filename) 

Not ben kodunuzu başka bir küçük iyileşme önerdi: Read.csv() bir veri döndürür. frame - bu, llply() yerine ldply() öğesini kullanabileceğiniz anlamına gelir.

+3

rep seçeneğiyle, isteğe bağlı olarak, '$ $ kaynak <- filename' de çalışırdı –

+0

@Karsten W, teşekkürler. Önerinizi yansıtacak şekilde kodu düzenledim. – Andrie

+0

Bu biraz saçma bir soru olabilir, ancak ... Değişikliğinizi kullanırken (ldply()), veriler tüm sütun başlıkları satır başlıklarına aktarılacak şekilde yeniden biçimlendirilir ve dosya adları (sayılarla birlikte) sütun başlıkları olur . Bunun etrafında bir yolu var mı? Llply kullanmanın bir dezavantajı var mı? – Arndt

1

Kinda karışık ama işler: Zaten bütün yaptık

filenames <- c("foo.csv","bar.csv") 
import.list <- list(matrix(,4,4),matrix(6,6)) 

source <- unlist(sapply(1:length(filenames),function(i)rep(gsub(".csv","",filenames[i]),nrow(import.list[[i]])))) 

source 
[1] "foo" "foo" "foo" "foo" "bar" "bar" "bar" "bar" "bar" "bar" 

combined$source <- source 
12

bu deneyin:

do.call("rbind", sapply(filenames, read.csv, simplify = FALSE)) 

satır adları kaynak ve satır numarasını gösterir.

3

data.table çözüm

Güncelleme: Burada keep.rownames kullanarak bu için tam bir data.table çözümdür. Varsayarsak tüm CSV'ler bir klasörde şunlardır:

library(data.table) 
my.path <- "C:/some/path/to/your/folder" #set the path 
filenames <- paste(my.path, list.files(path=my.path), sep="/") #list of files 

#this will create a rn column with the path in it 
my.dt<- data.table(do.call("rbind", sapply(filenames, read.csv,  
        sep=";")), keep.rownames = T) 

Temel sözdizimi çözüm

Ben Grothendieck en çözümünü kullanılan ve satır isimlerinin bir sütun oluşturmak için bir çizgi ekledi. Yalnızca dosya adının bir kısmını isterseniz

something <- do.call("rbind", sapply(filenames, read.csv, sep=";", simplify = FALSE)) 
something$mycolumn <- row.names(something) 

, böyle bir şey ile 2 satır değiştirin::

something$mycolumn <- substring(row.names(something),1,3) 

Bu şekilde dosya ismi 1st 3 karakter kullanacağını kadar basit yeni sütundaki değer.

0

İşte bu amaç için tasarlanan rio numaralı import_list() işlevini kullanarak bir çözüm.

str(rio::import_list(dir(pattern = "mtcars")), 1) 
## List of 3 
## $ :'data.frame':  32 obs. of 11 variables: 
## $ :'data.frame':  32 obs. of 11 variables: 
## $ :'data.frame':  32 obs. of 11 variables: 

Ama bunun yerine tek bir veri çerçevesi oluşturmak için rbind argüman kullanabilirsiniz (sonunda _file sütunu not:

# setup some example files to import 
rio::export(mtcars, "mtcars1.csv") 
rio::export(mtcars, "mtcars2.csv") 
rio::export(mtcars, "mtcars3.csv") 

import_list() varsayılan davranışı veri çerçevelerinin listesini elde etmektir):

str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE)) 
## 'data.frame': 96 obs. of 12 variables: 
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ... 
## $ disp : num 160 160 108 258 360 ... 
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ... 
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
## $ qsec : num 16.5 17 18.6 19.4 17 ... 
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ... 
## $ am : int 1 1 1 0 0 0 0 0 0 0 ... 
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ... 
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ... 
## $ _file: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ... 

ve rbind_label argüman her fil tanımlayan sütunun adını belirtmek için E:

str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE, rbind_label = "source")) 
## 'data.frame': 96 obs. of 12 variables: 
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... 
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ... 
## $ disp : num 160 160 108 258 360 ... 
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ... 
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
## $ qsec : num 16.5 17 18.6 19.4 17 ... 
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ... 
## $ am : int 1 1 1 0 0 0 0 0 0 0 ... 
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ... 
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ... 
## $ source: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ... 

Tam açıklama için: Ben rio sürdürücü değilim.

İlgili konular