2015-02-24 9 views
5

Ich versuche, mit dif.length der Zeilen zwei txt-Dateien rbind, zum Beispiel:rbind Textdateien mit unterschiedlicher Länge der Zeilen

Ich benutze diesen Code:

a<-matrix(1:12,4,3) 
b<-matrix(21:41,7,3) 

setwd("test/") 
write.table(a, file="a.txt",quote=FALSE, row.names=FALSE,col.names=FALSE) 
write.table(b, file="b.txt",quote=FALSE, row.names=FALSE, col.names=FALSE) 
file_list <- list.files() 
g<- do.call(rbind,lapply(file_list,FUN=function(files){scan(files,what = character())})) 

Ich habe diese Warnung Nachricht:

"In (function (..., deparse.level = 1): Anzahl der Spalten des Ergebnisses nicht ein Vielfaches von Vektorlänge (arg 1)"

I g wollen wie folgt aussieht :

##  [,1] [,2] [,3] 
## [1,] 1 5 9 
## [2,] 2 6 10 
## [3,] 3 7 11 
## [4,] 4 8 12 
## [5,] 21 28 35 
## [6,] 22 29 36 
## [7,] 23 30 37 
## [8,] 24 31 38 
## [9,] 25 32 39 
## [10,] 26 33 40 
## [11,] 27 34 41 

Gibt es eine Lösung dafür, wie ich neue i R bin? Vielen Dank,

+0

sollten Sie nicht herausfinden, warum Sie diesen Fehler erhalten, anstatt eine rohe Gewaltlösung zu wollen, besonders, weil Sie neu sind? – rawr

+0

Ich habe bereits nach einer Lösung gesucht, aber das habe ich nicht gelöst. – pshls

+0

Für einen Neuling ist Ihr erster Beitrag ein viel besserer erster Beitrag als meiner damals. Ich bin mir nicht sicher, was Sie meinen, aber es scheint, dass rbind (a, b) die obige Ausgabe erzeugt. – DJJ

Antwort

3

Sofern Sie ihm nicht anders sagen, scan() die gesamte Datei als einen einzigen atomaren Vektor gelesen wird. Sie könnten eine Liste an das Argument what übergeben, aber es ist viel einfacher und sicherer, eine Funktion zu verwenden, die strukturierte Daten liest. Außerdem möchten Sie what = character() nicht verwenden, weil Sie numerische Werte lesen.

read.table() in der Basis R und fread() aus dem Paket "data.table" kann dies ziemlich leicht tun.

files <- c("a.txt", "b.txt") 

## read.table() 
data.matrix(do.call(rbind, lapply(files, read.table)), rownames.force = FALSE) 

## fread() 
library(data.table) 
data.matrix(rbindlist(lapply(files, fread))) 

dieser Beide geben die Matrix

#  V1 V2 V3 
# [1,] 1 5 9 
# [2,] 2 6 10 
# [3,] 3 7 11 
# [4,] 4 8 12 
# [5,] 21 28 35 
# [6,] 22 29 36 
# [7,] 23 30 37 
# [8,] 24 31 38 
# [9,] 25 32 39 
# [10,] 26 33 40 
# [11,] 27 34 41 

Wenn Sie wirklich verwenden scan() wollte, eine Liste zum what Argument übergeben konnte die Anzahl der Spalten zu erzählen.

## get number of columns 
nc <- max(unlist(lapply(files, count.fields))) 
## read as a list, then bind together 
do.call(rbind, lapply(files, function(x) { 
    do.call(cbind, scan(x, what = as.list(double(nc)), quiet = TRUE)) 
})) 
#  [,1] [,2] [,3] 
# [1,] 1 5 9 
# [2,] 2 6 10 
# [3,] 3 7 11 
# [4,] 4 8 12 
# [5,] 21 28 35 
# [6,] 22 29 36 
# [7,] 23 30 37 
# [8,] 24 31 38 
# [9,] 25 32 39 
# [10,] 26 33 40 
# [11,] 27 34 41 

Aber das ist nur count.fields() und dann scan(), die im Grunde ist das, was read.table() in einem Schritt tut. Außerdem kann dies riskant sein, wenn in den Daten Werte fehlen.

+0

genau was ich will ........... danke Richard – pshls

0

Ich bin kein Fan von Scan, obwohl, ich bin sicher, dass es seinen Zweck in einigen Situationen erfüllt.

Ich schlage daher folgende mit read.csv und write.csv:

a<-matrix(1:12,4,3) 
b<-matrix(21:41,7,3) 

setwd("test/") 
write.csv(a, file="a.txt",row.names=FALSE,col.names=FALSE) 
write.csv(b, file="b.txt", row.names=FALSE, col.names=FALSE) 
file_list <- list.files() 
g <- do.call(rbind,lapply(file_list,FUN=function(files){read.csv(files)})) 

Wenn Sie einen Blick auf ?scan nehmen. Sie können herausfinden, warum Sie den Fehler erhalten haben. Mein Verständnis ist, dass es die Tabelle in einer Zeile liest:

> scan('a.txt',what=character()) 
## Read 6 items 
## [1] "V1"    ",\"V2\",\"V3\"" "1,5,9"   "2,6,10"   
## [5] "3,7,11"   "4,8,12"   
> scan('b.txt',what=character()) 
## Read 9 items 
## [1] "V1"    ",\"V2\",\"V3\"" "21,28,35"  "22,29,36"  
## [5] "23,30,37"  "24,31,38"  "25,32,39"  "26,33,40"  
## [9] "27,34,41"  
+0

Danke DJJ für Ihren Versuch.That gibt die gleiche Warnung.Sie haben Recht mit dem Scan. Es liest die Tabelle in einer Zeile. Wenn ich eine Matrix hätte, würde ich das mit: a1 <-scan ('a.txt', was = zeichen()), a2 <-matrix (a1 , ncol = 3, byrow = T). In meinem Fall beginnt das Problem bei rbind 2 txt files. – pshls

+0

Sorry einige Tippfehler im Code. Jetzt sollte es besser funktionieren. – DJJ

Verwandte Themen