2016-03-23 8 views
0

Bir listeye veya ayrı bir veri çerçevesine içe aktarmam gereken 537 .txt dosyasına sahibim. Çok önemli olduğu için herhangi bir veri eklemek istemiyorum her şeyi ayrı tutmak için.Birden çok .txt dosyasını R'ye aktar ve gerçek veri satırlarına atla

Her dosyayı yeniden adlandırdım, bu nedenle dosya adlarının hepsi eşittir. Her dosyada, çok çeşitli bilgi içeren bir başlık bölümü vardır. Bu başlık bölümü, dosyaya bağlı olarak 12-16 satırdır. Veriler için 5 ile 7 sütunlarım var. Verilerin tümü sekmeyle ayrılmış. Sütun sayısı 5 ve 9 sütun arasında değişir ve sütunlar her zaman aynı sırada değildir, bu nedenle sütun adlarını veriyle içe aktarabilirim (sütun adları dosyalarda aynıdır). aşağıdaki gibi dosya biçimi şöyledir:

Üstbilgi

Üstbilgi

Üstbilgi

Üstbilgi ... en fazla 16 satır

((başlık ve sütun adları arasındaki boşlukların sayısı

Tarih (\ t) (\ t) dataCol1 (\ t) dataCol2 (\ t) dataCol3 (\ t) dataCol4

0)) değişir

((sütun isimleri ve) arasında boş bir sıra)

/gg/yyyy (\ t) ss: dd: ss (\ t) birimi (\ t) birimi (\ t) birimi (\ t) birim

((birimleri ve veriler arasında 1 boş satır))

01/31/2016 (\ t) 14:32:02 (\ t) 14.9 (\ t) 25.3 (\ t) 15.8 (\ t) 25,6

(4000 satırlar için (veri tekrarlar))

ihtiyacım olanı özetlemek için: İçe dosyaların tümü bireysel d içine ata çerçeveleri veya veri çerçeveleri listesi. Üstbilgi bilgilerini "Tarih" ile satırın üzerine atlayın (ve muhtemelen satır ve boş satırdaki iki satırı silin) ​​ve bir sonraki sütun adları ve aşağıdaki verileri içeren bir satır bırakın.

Kod için çalıştığım şeyin ham bir kopyası. Buradaki fikir, tüm dosyaları R'ye aktardıktan sonra, her dosyadaki 1-2 sütun için maksimum değeri belirler. Ardından, her dosya için 2 satır içeren her bir dosya için 2 satır içeren 2 satır olacak tek bir dosya verin.

Şu anda bildiğim
##list files and create list for data.frames 
path <- list.files("Path",pattern = NULL, all.files=FALSE,full.names=TRUE) 
files <- list() 

##Null list for final data to be extracted to 
results <- NULL 

##add names to results list (using file name - extension 
results$name <- substr(basename(path),1,nchar(basename(Path))-4) 

##loop to read in data files and calculate max 
for(i in 1:length(path){ 
    ##read files 
    files[[i]] <- read.delim(path[[i]],header = FALSE, sep = "\t", skip = 18 

    ##will have to add code: 
    ##"if columnx exists do this; if columny exists do this" 
    ##convert 2 columns for calculation to numeric 
    x.x <- as.numeric(as.character(files$columnx)) 
    x.y <- as.numeric(as.character(files$columny)) 

    ##will have to add code: 
    ##"if column x exists, do this....if not, "NA" 
    ##get max value for 2 specific columns 
    results$max.x <- max(files$columnx) 
    results$max.y <- max(files$columny) 
} 

##add results to data frame 
max <- data.frame(results) 

##export to .csv 
write.csv(max,file="PATH") 

, benim kod sadece (maks yüzden bana zarar vermez 1 veya 2 satır atlama, dosyada sonradan çok kadar gelmiyor) verilerine geçmiş herşeyi atlar ve varsayar sütunlar her dosyada aynı sıradadır. Bu korkunç bir uygulama ve veri noktalarının yaklaşık% 5'inde bana kötü sonuçlar veriyor, ancak bunu doğru bir şekilde yapmak istiyorum. Başlıca endişem, verileri kullanılabilir bir biçimde R'ye almak. Sonra diğer hesaplamaları ve dönüşümleri ekleyebilirim. R için yeniyim ve 2 gün aradıktan sonra, herhangi bir foruma önceden gönderdiğim yardımı bulamadım.başlığının yapısı bir hat \ aşağıdaki n Satır \ N Data ve satır numarası için grep kullanabilir varsayılarak

+1

Yukarıdaki yaklaşımın iz üzerinde olduğu anlaşılıyor. Başlık bilgisi problemini çözmek için, benim yaklaşımım olacaktır (tüm detaylar olmadan): İlk 20 satırı <-readLines (yol [[i]], n = 20) ile okuyun. Tarih ile başlayan satırı bulmak için grep ("^ Tarih", başlık) kullanın. Ardından, sütun başlığı dizisi oluşturmak için "strsplit" öğesini kullanın. Grep komutunun sonuçlarından, verilerin başlangıç ​​satırını hesaplayabilir ve bunu yukarıdaki read.delim hattınıza aktarabilirsiniz. İyi şanslar – Dave2e

+0

Teşekkürler, Dave2e. @TJGorrie cevabını onun koduna ekledi, böylece ikiniz arasında, ben olduğumdan çok daha yakınım! – JRW485

+0

Devam edildiğini duyduğuma sevindim. Sorun yaşadığınızda, güncellenmiş kodunuzla yeni bir soru ve daha fazla yardım için bazı örnek veriler yayınlayın. Forum, başlangıç ​​noktasının bir örneğini ve istenen son noktayı görmeyi seviyor. – Dave2e

cevap

0

burada "aa/gg/yyyy" Bu şekilde

:

system("grep -nr 'mm/dd/yyyy' ran.txt", intern=T) 
# ran.txt is an arbitrary text file I created, we will substitute 
# 'ran.txt' with path[[i]] later on. 
#[1] "6:mm/dd/yyyy\thh:mm:ss\tunits\tunits\tunits\tunits" 

Bundan sonra strsplit çıkışını aşağıdaki numaradan önce yapabiliriz: ve bu argümanı skip için gerekli değer olarak kullanın.

as.numeric(strsplit(system("grep -nr 'mm/dd/yyyy' ran.txt", intern=T),":")[[1]][1]) 
# [[1]][1] will specify the first element of the output of strsplit as 
# in the output the hh:mm:ss also is split. 
# [1] 6 

bizim adlandırılan satır ve biz bu 1 eklenir ve sonra verileri okumaya başlayabilir fiili veriler arasındaki boş bir satır olduğu gibi.

Thusly:

##list files and create list for data.frames 
path <- list.files("Path",pattern = NULL, all.files=FALSE,full.names=TRUE) 
files <- list() 

##Null list for final data to be extracted to 
results <- NULL 

##add names to results list (using file name - extension 
results$name <- substr(basename(path),1,nchar(basename(Path))-4) 

##loop to read in data files and calculate max 
for(i in 1:length(path){ 
##read files 
# Calculate the number of rows to skip. 
# Using Dave2e's suggestion: 
header <-readLines("path[[i]]", n=20) 
skip <- grep("^mm/dd/yy", header) 
#Add one due to missing line 
skip <- skip + 1 
files[[i]] <- read.delim(path[[i]], 
         header = FALSE, 
         sep = "\t", 
         skip = skip) 

##will have to add code: 
##"if columnx exists do this; if columny exists do this" 
##convert 2 columns for calculation to numeric 
x.x <- as.numeric(as.character(files$columnx)) 
x.y <- as.numeric(as.character(files$columny)) 

##will have to add code: 
##"if column x exists, do this....if not, "NA" 
##get max value for 2 specific columns 
results$max.x <- max(files$columnx) 
results$max.y <- max(files$columny) 
} 

##add results to data frame 
max <- data.frame(results) 

##export to .csv 
write.csv(max,file="PATH") 

Ben ilgili her şeyi kapsadığını düşünüyorum.

+0

Kodumu güncelledim ve şu hatayı alıyorum: "Sistemde hata var (yapıştır (" grep -nr 'mm/dd/yyyy' ", yol [[i]]), intern = T): { atlamak için satır sayısını hesaplamak ## dosyaları okumak ##: (uzunluk (yol) i 1'de) için veri dosyalarının okumak için '## döngü: 'grep' İşte benim kod bulunamadı" <- as.numeric ( strsplit ( sistemi atla) (yapıştır ("grep -nr \ 'mm/gg/yyyy \" ", yol [[i]]), intern = T),": ") [[ 1]] [1]) atla <- atla + 1 dosyaları [[i]] <- read.delim (yol [[i]], başlık = FALSE, sep = "\ t", atla = atla) } ' – JRW485

+0

Bu benim hatamdı, @ dave2e yorumunu dahil etmek için cevabımı değiştirdim. Bunu yapmak istediğinizi de yapacağınız gibi. – TJGorrie

+0

Hata yaptığımda, Linux'u kullandığınız varsayımı yaptım, muhtemelen Windows kullanacağınızı ve Rtools'unuz yoksa "sisteminizin" grep'lerini tanıyamayacağınızı kabul ediyorum. – TJGorrie

İlgili konular